Вы спрашиваете, почему саб виден за пределами блока?Если это так, то это потому, что ключевое слово sub
времени компиляции помещает sub в пространство имен main
(если только вы не используете ключевое слово package
для создания нового пространства имен).Вы можете попробовать что-то вроде
{
my $a = sub {
print 1;
};
$a->(); # works
}
$a->(); # fails
В этом случае ключевое слово sub
не создает подпрограмму и не помещает ее в пространство имен main
, а вместо этого создает анонимную подпрограмму и сохраняет ее в лексической областипеременная.Когда переменная выходит из области видимости, она больше не доступна (обычно).
Чтобы узнать больше, ознакомьтесь с perldoc perlsub
Кроме того, знаете ли вы, что выможете проверить, как Perl-анализатор видит ваш код?Запустите perl с флагом -MO=Deparse
, как в perl -MO=Deparse yourscript.pl
.Ваш исходный код анализируется как:
sub a {
print 1;
}
{;};
a ;
Сначала скомпилируется подпрограмма, затем запускается блок без кода, затем вызывается a
.
Для моего примера в Perl6 см .: Успех , Отказ .Обратите внимание, что в Perl 6 разыменование составляет .
, а не ->
.
Редактировать: Я добавил еще один ответ о новой экспериментальной поддержке лексических подпрограмм, ожидаемой для Perl 5.18.