为什么以下代码中没有重新声明$i
的警告?
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
for my $i (1..3) {
my $i = 'DUMMY';
print Dumper $i;
}
答案 0 :(得分:9)
实际上,您只会在同一范围内收到重新定义的警告。写作:
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!
};
答案 1 :(得分: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
声明。