当我重新声明Perl foreach控制变量时,为什么不收到警告?

时间:2010-02-16 15:05:01

标签: perl variables warnings

为什么以下代码中没有重新声明$i的警告?

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

for my $i (1..3) {
  my $i = 'DUMMY';
  print Dumper $i;
}

2 个答案:

答案 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)

如果您在当前范围或声明中重新声明myourstate变量,则会收到警告。第一个$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声明。