perl closured变量返回空字符串

时间:2013-04-03 18:03:39

标签: perl lambda closures

我无法解释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;

2 个答案:

答案 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”作为该行的有和没有"".的输出。

相关问题