2013-05-02 21 views
7

带有一点Perl的新手,我只是遇到了一个错误,我不小心不喜欢的东西(例如简化):为什么在重新声明内部作用域中的变量时,perl不会发出警告?

my $i=0; 
for(my $i=0;$i<10; $i++) 
    { 
    print $i; 
    } 
print $i; # $i is zero, my code expected 9 

Why don't I get a warning when I redeclare the Perl foreach control variable?我明白,这是正常现象;除非重新声明在同一范围内,否则我不应该发出警告。

但是,我不明白为什么会出现这种情况。为什么perl不会在这里发出警告?在我看来,这可能是一个错误的原因,通常不是有意的。有一些常见的情况,这是正常的编程风格,所以警告会很烦人?

+3

@Mat - 更可能的是,这样的代码是手动重构过程中出现错误的结果,而不是通过设计。例如。更可能是一个错误比预期的东西。 – DVK 2013-05-02 13:02:39

+0

杜。而且由于人们有时会做他们不打算做的事情,编译器会有警告。 – innaM 2013-05-02 13:02:43

+0

@Mat:'my $ foo; my $ foo;'也会用'my'显式地请求一个新变量,但是Perl仍然会发出警告_“my”变量$ foo会在同一个scope_中掩盖前面的声明。这不仅仅是“你正在提出明确的要求”。 – 2013-05-02 14:40:48

回答

7

Perl并不倾向于提出风格问题,但我很难相信有人会故意想要在不同的作用域深度使用相同的var名称。

它可能是有用的唯一情况是想到的是

{ 
    my $x = $x; 
    ... do some something that changes $x ... 
} 
# $x is restored here. 

从有利的一面,有一个perlcriticrule识别这样的问题。

+0

对于Perl ::批评家推荐+1。 – dolmen 2013-05-02 15:46:19

+0

@dolmen,不确定我会称之为推荐。这是一个选项。 – ikegami 2013-05-02 16:06:28

+0

我会接受这个答案,即使它没有真正回答我的问题。 Perlcritic似乎是一个有用的工具来帮助解决这类问题。 – tengfred 2013-05-06 07:50:36

相关问题