Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以用Perl定义一段代码吗?_Perl - Fatal编程技术网

我可以用Perl定义一段代码吗?

我可以用Perl定义一段代码吗?,perl,Perl,就像C中的#define(预处理器指令)一样,有没有任何方法可以在perl中定义代码块 use constant PI=>3.14; 像这样,我只能定义变量。 我能用一段代码做同样的事情吗 以下代码部分不起作用。我怎样才能达到同样的效果 use constant FUN=>{ $i=3; while($i) { print "$i\n";--$i;} } 使用sub关键字定义函数。 与C语言不同,预处理在诸如perl之类的脚本语言中几乎毫无用处。使用sub关键字定义函数。

就像C中的
#define
(预处理器指令)一样,有没有任何方法可以在perl中定义代码块

use constant PI=>3.14;
像这样,我只能定义变量。 我能用一段代码做同样的事情吗

以下代码部分不起作用。我怎样才能达到同样的效果

use constant FUN=>{
$i=3;
while($i)
{
    print "$i\n";--$i;}
}

使用
sub
关键字定义函数。
与C语言不同,预处理在诸如perl之类的脚本语言中几乎毫无用处。

使用
sub
关键字定义函数。 与C语言不同,预处理在诸如perl之类的脚本语言中几乎毫无用处。

perl没有宏。(一个足够疯狂的程序员可以使用源代码过滤器来伪造它们,但最好避免这种黑魔法。)
使用常量不会像C预处理器那样触发内联替换。相反,它创建一个始终返回相同值的子例程。当你写作时

use constant PI => 3.14;
Perl所做的(本质上)是

常量
杂注只能用于定义值,不能用于定义代码。要重用代码,请定义一个子例程。

Perl没有宏。(一个足够疯狂的程序员可以使用源代码过滤器来伪造它们,但最好避免这种黑魔法。)
使用常量不会像C预处理器那样触发内联替换。相反,它创建一个始终返回相同值的子例程。当你写作时

use constant PI => 3.14;
Perl所做的(本质上)是


常量
杂注只能用于定义值,不能用于定义代码。要重用代码,请定义一个子例程。

大多数人会这样写(给出或接受大括号的位置):

你可以做:

my $FUN = sub { print "$_\n" foreach (qw(3 2 1)); };
&$FUN();

大多数人会这样写(给出或接受大括号的位置):

你可以做:

my $FUN = sub { print "$_\n" foreach (qw(3 2 1)); };
&$FUN();

perl中的Try/catch可以通过以下方式实现:

eval {
  # do something
  die "Exception1\n" if $something_not_right;
};
if ($@) {
  for ($@) {
    /Exception1/ && do { handle_excp1(); last; };
    /Exception2/ && do { handle_excp2(); last; };
    die "Don't know how to handle $@\n";
  };
};

当然,您不必使用字符串文字来抛出异常。任何对象引用都可以。perl中的Try/catch可以通过以下方式实现:

eval {
  # do something
  die "Exception1\n" if $something_not_right;
};
if ($@) {
  for ($@) {
    /Exception1/ && do { handle_excp1(); last; };
    /Exception2/ && do { handle_excp2(); last; };
    die "Don't know how to handle $@\n";
  };
};

当然,您不必使用字符串文字来抛出异常。任何对象引用都可以。

这有点麻烦,但您可以使用string eval实现代码的运行时评估:

use strict;
use warnings;
my $code = "
my \$value = 17;
print \"\$value\n\";
" ;

eval $code ;
结果:

[pt@localhost bin]$ perl testit2
17
[pt@localhost bin]$
如果你写任何复杂的东西,你都需要疯狂的逃避技巧。

更新:如果您使用q()而不是“那么就不需要太多的转义了。

这有点像黑客,但是您可以使用string eval来实现代码的运行时评估:

use strict;
use warnings;
my $code = "
my \$value = 17;
print \"\$value\n\";
" ;

eval $code ;
结果:

[pt@localhost bin]$ perl testit2
17
[pt@localhost bin]$
如果你写任何复杂的东西,你都需要疯狂的逃避技巧。

更新:如果您使用q()而不是“那么就不需要太多转义了。

好吧,C预处理器并不是主要用于定义内联函数。。。另外,即使几乎所有的编译语言都可以在没有预处理器的情况下使用:)sub也可以,但我正在检查是否允许使用预处理器,比如C。实现try-catch机制。我试着在代码中嵌入catch代码段,而不是调用子例程。不要发明自己的try/catch。改用Try::Tiny()。您的问题是一个问题。如果你问——或者至少告诉我们——你的根本问题(try/catch)而不是方法问题(宏),你会得到更好的答案。。。另外,即使几乎所有的编译语言都可以在没有预处理器的情况下使用:)sub也可以,但我正在检查是否允许使用预处理器,比如C。实现try-catch机制。我试着在代码中嵌入catch代码段,而不是调用子例程。不要发明自己的try/catch。改用Try::Tiny()。您的问题是一个问题。如果你询问——或者至少告诉我们——你的根本问题(try/catch),而不是方法问题(宏),你会得到更好的答案;请参见
Devel::Declare
;请参见
Devel::Declare