問題がsub name {...}
構築物がそのようにネストすることができないことですfor
ループ内にあります。 sub name {...}
が本当にBEGIN {*name = sub {...}}
を意味し、開始ブロックは、すぐに彼らが解析されるように実行されるため、
理由があります。したがって、コンパイル時およびサブルーチンの変数バインディングは、コンパイル時に、forループが実行される前に発生します。
#!/usr/bin/env perl
use strict;
use warnings;
my @foo = (0,1,2,3,4);
foreach my $i (@foo) {
my $printer = sub {
my $blah = shift @_;
print "$blah-$i\n";
};
$printer->("test");
}
、これらの閉鎖は意志あなたの本当のユースケースではおそらく
test-0
test-1
test-2
test-3
test-4
を出力します。
は何がやりたいことは、実行時にその変数をバインドする、匿名のサブルーチンを作成することです後でアクセスできるように配列またはハッシュにロードすることができます。
あなたはまだ閉鎖して識別子を裸の単語を使用することができますが、名前はコンパイル時に表示されていることを確認するために少し余分な作業を実行する必要があります。
BEGIN {
for my $color (qw(red blue green)) {
no strict 'refs';
*$color = sub {"<font color='$color'>@_</font>"}
}
}
print "Throw the ", red 'ball'; # "Throw the <font color='red'>ball</font>"
非常に興味深い、ありがとう – Snark