我可以在Perl中定义代码块吗?

时间:2011-01-06 12:42:09

标签: perl

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

use constant PI=>3.14;

像这样我只能定义变量。 我可以用一段代码做同样的事吗?

以下代码部分不起作用。我怎样才能实现同样的目标?

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

5 个答案:

答案 0 :(得分:3)

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

use constant PI => 3.14;

Perl的作用(基本上)

sub PI() { 3.14 }

constant pragma只能用于定义值,而不能用于定义代码。要重用代码,请改为定义子程序。

答案 1 :(得分:2)

大多数人都会写下(给予或采取大括号的定位):

sub FUN
{
    my $i = 3;
    while ($i)
    {
        print "$i\n";
        --$i;
    }
}

你可以这样做:

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

答案 2 :(得分:0)

使用sub关键字定义功能。 与C语言不同,预处理在诸如perl等脚本语言中几乎无用。

答案 3 :(得分:0)

这有点麻烦,但是您可以使用字符串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()而不是“,那么将需要更少的转义。

答案 4 :(得分:-1)