perl の振る舞いを簡単な表現で説明することはできません。問題をこの比較的短い perl コードに切り分けました。make_peak は、シグナル v() の最大値を追跡し、この最大値をクロージャ変数 $max に保持する関数を返します。
そのまま、コードは「2」を出力します。しかし、不器用な「」を削除すると。return ステートメントで、$p->() は undef? を返します。
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;