JavaScript では arguments.callee を使うと以下のように無名関数の再帰が書ける (function(c) { if (c == undeinfed) c = 10; console.log(c); if (c--) arguments.callee(c); }); Perl で そういうことをやる方法を知らないので do { my $c = 10; my $callee = sub { print "$c\n"; &$callee if ($c--); }; }->(); とやろうと思ったら怒られた>< なんで怒られたれたかというと sub は作られた時点のレキシカル変数しか記憶しないからのようだ。 さっきの例の my $callee = sub { ... }; では、 sub { ... } の評価が my より先に行われる。 なので、 sub { ... }