为什么Perl没有警告在同一范围内重新声明my()变量?

时间:2011-06-29 11:29:08

标签: perl syntax-error

use strict;

my $world ="52";

my $in = "42" ;

my $world="42";

my $out = "good" ."good";

chop($out);

print $out;

不要担心代码。问题是我在两个不同的行中使用my $world但是编译器没有给出任何错误但是如果我们考虑C语言的语法,那么我们将因为重新声明而得到错误变量。为什么perl没有给重新声明带来任何错误。我还有一个问题:标量变量的大小是多少?

3 个答案:

答案 0 :(得分:11)

1 /变量重新声明不是错误。如果您包含“使用警告”,那么您会收到警告。

2 /“标量变量的大小”是指它可以存储的数据量?如果是这种情况,Perl不会施加任意限制。

您似乎很快就会发布很多相当简单的问题。您是否考虑过阅读"Learning Perl"

答案 1 :(得分:5)

  

问题是我的$ world我在两个不同的行中使用它但是编译器说没有错误但是对于c我们得到错误作为变量的重新声明,但为什么不在perl中。

仅仅因为Perl不是C,重新定义变量不是错误条件。

这可能是导致意外行为的原因,如果你有use warnings;(就像suggested to you before一样),它会被接收。

  

标量变量的大小是多少?有什么尺寸吗?

定义'尺寸'。字节?人物?别的什么?您可能正在寻找length

答案 2 :(得分:2)

因为Perl喜欢健壮。如果你打开了warnings,你就会听说过它。

"my" variable $world masks earlier declaration in same scope at - line 7.

虽然USUW(use strict; use warnings;)是一个很好的开发实践,但使用autodie - 如果 autodie担心语法警告。但是,以下概念大致相同,以确保您不会避免任何警告。

BEGIN { $SIG{__WARN__} = sub { die @_; }; }

上面的代码为警告创建了一个信号处理程序。但是,我认为这对初学者来说更好:

BEGIN {
    $SIG{__WARN__} 
        = sub { 
            eval { 
                # take me out of the chain, to avoid recursion
                delete $SIG{__WARN__};
                # diag will install the warn handler we want to use.    
                eval 'use diagnostics;';  
                $SIG{__WARN__}->( @_ ); # invoke that handler
            };
            exit 1; # exit regardless of errors that might have cropped up.
        }; 
}

您想要的任何地方,您都可以告诉perl您不想更改代码以发出特定类别的警告(diagnostics将告诉您类别!)并且如果您明确告诉perl {{1它不仅不会警告你,而且它也不会触发警告处理程序,它会杀死程序。

这会给你一个更像c的感觉 - 除了c也有警告(所以你也可以实现一个词法计数器......哦。)