1

我无法用看似简单的表达式来解释 perl 的行为。我已将我的问题与这段相对较短的 perl 代码隔离开来。make_peak 返回一个函数,该函数跟踪信号 v() 的最大值并将该最大值保存在封闭变量 $max 中。

事实上,代码打印“2”。但是,如果我删除 kludgy ""。在返回语句中,$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;
4

2 回答 2

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;
于 2013-04-03T19:01:40.297 回答
0

这似乎是您的 Perl 版本中的一个错误。继续运行

This is perl 5, version 14, subversion 2 (v5.14.2) built for i686-linux-gnu-thread-multi-64int

"".我得到“2”作为在那条线上有和没有的输出。

于 2013-04-03T18:20:00.973 回答