Почему я не получаю предупреждение, когда я переопределяю переменную управления Perl foreach?
Почему в следующем коде не появляется предупреждение о переопределении $i?
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
for my $i (1..3) {
my $i = 'DUMMY';
print Dumper $i;
}
Ответ 1
Собственно, вы получаете предупреждения только для переопределений в той же области. Запись:
use warnings;
my $i;
{
my $i;
# do something to the inner $i
}
# do something to the outer $i
отлично действует.
Я не уверен, что внутренности Perl обрабатывают его таким образом, но вы можете думать о своем цикле for как о том, как разбираться как
{
my $i;
for $i ( ... ) { ... }
# the outer scope-block parens are important!
};
Ответ 2
Вы получите предупреждение, если вы обновите переменную my, our или state в текущей области или инструкции. Первый $i на самом деле не является лексической переменной. Вы можете доказать это с помощью Devel::Peek:
use Devel::Peek;
for my $i (1) {
Dump $i;
}
SV = IV(0x81178c8) at 0x8100bf8
REFCNT = 2
FLAGS = (IOK,READONLY,pIOK)
IV = 1
В FLAGS нет флага PADMY, который указывает, что $i является лексической переменной, объявленной с помощью my.