Perl имеет две отдельные, но в значительной степени совместимые переменные системы.Глобальные переменные, которые находятся в таблице символов, и лексические переменные, которые находятся в лексических площадках, связанных с областью видимости.
Глобальные переменные могут быть целью символической разыменования и могут подвергаться динамической области видимости с local
.Лексические переменные (определенные с помощью my
) могут быть закрыты.
Переменные совпадения с регулярным выражением (и все другие специальные переменные Perl) являются глобальными переменными в таблице символов, поэтому нет возможности закрыть их.
Чтобы это исправить, просто скопируйте значение в лексический:
use warnings;
while ("1234567890"=~/(.)/sg) {
my $x = $1; # creates a new lexical that the sub closes over
push @subs, sub{print $x;};
}
for (@subs) {$_->()}