我无法解释perl的行为似乎是一个简单的表达。 我把我的问题与这个相对较短的perl代码隔离开了。 make_peak返回一个函数,该函数跟踪信号v()的最大值,并将此最大值保存在闭包变量$ max中。
实际上,代码打印“2”。但如果我删除kludgy“”。在return statemnt中,$ p->()返回uundef?
use strict;
our $i=0;
sub v($) {
$i=$i+1;
return $i;
}
sub make_peak($)
{
my $vi=$_[0];
my $max=-1e35;
return sub() {
$max=v($vi) if v($vi)>$max;
return "".$max; # ??? without the kludge returns empty line
};
}
my $p=make_peak(10);
my $m=$p->();
print $m;
答案 0 :(得分:2)
主要问题是您将匿名/ lambda子例程声明为sub() {...}
。只需使用sub {...}
use strict;
use warnings;
my $i=0;
sub v {
$i=$i+1;
return $i;
}
sub make_peak
{
my $vi=$_[0];
my $max=-1e35;
return sub {
$max = v($vi) if v($vi) > $max;
return $max; # ??? without the kludge returns empty line
};
}
my $p=make_peak(11);
my $m=$p->();
print $m;
答案 1 :(得分:0)
这似乎是您的Perl版本中的错误。在
上运行This is perl 5, version 14, subversion 2 (v5.14.2) built for i686-linux-gnu-thread-multi-64int
我得到“2”作为该行的有和没有"".
的输出。