В Perl 5.20 цикл for, похоже, способен модифицировать переменную с модулем, но не лексическую переменную в родительской области.
#!/usr/bin/env perl
use strict;
use warnings;
our $x;
sub print_func {
print "$x\n";
}
for $x (1 .. 10) {
print_func;
}
печатает от 1 до 10, как и следовало ожидать, но следующее:
#!/usr/bin/env perl
use strict;
use warnings;
my $x;
sub print_func {
print "$x\n";
}
for $x (1 .. 10) {
print_func;
}
выдает следующее предупреждение 10 раз:
Use of uninitialized value $x in concatenation (.) or string at perl-scoping.pl line 8.
Что здесь происходит? Я знаю, что подпрограммы perl не могут быть вложены (и всегда имеют область модуля), и поэтому представляется логичным, что они не смогут закрыть переменные my
. Похоже, в этом случае perl в режиме strict
должен отклонить вторую программу с сообщением следующего вида:
Global symbol "$x" requires explicit package name at perl-scoping.pl line 6.
Global symbol "$x" requires explicit package name at perl-scoping.pl line 9.
т.е. он должен отклонить подпрограмму, потому что свободная переменная не объявлена нигде и цикл for, потому что переменная не была объявлена.
Почему Perl ведет себя так?