2017-02-15 53 views

回答

8

@arr是一个全局变量,它在解析器首次遇到时创建,然后在整个包中看到。

use warnings; 
#use strict; 

for (1..3) { 
    #my @arr; 
    for (1..3) { 
     push @arr, $_; 
    } 
} 

print "@arr\n"; 

它打印

 
1 2 3 1 2 3 1 2 3 

这是关于全局不好的事情之一,他们“辐射”整个代码。

随着use strict;使我们得到

 
Possible unintended interpolation of @arr in string at scope.pl line 11. 
Global symbol "@arr" requires explicit package name at scope.pl line 7. 
Global symbol "@arr" requires explicit package name at scope.pl line 11. 
Execution of scope.pl aborted due to compilation errors. 

由于strict仅仅是强制执行的声明,这个有意义的告诉我们,@arr是全球性的(因此随处可见的代码)。

声明它在上面会有相同的效果,但它与未声明的全局变量不同。 A my变量是词法和范围,最近的封闭块。从my

my声明列出的变量为本地网(词法),以封闭块,文件,或eval。如果列出多个变量,则列表必须放在括号内。

此外,词法不在符号表中。

因此,当它在第一个循环(注释掉行)内声明时,它在末尾看不到(它不存在于该循环的块外部)。最后一行然后是指在那里创建的全球@arr,它从未被分配到。我们确实得到警告

 
Possible unintended interpolation of @arr in string at scope.pl line 11. 
Name "main::arr" used only once: possible typo at scope.pl line 11. 

约用了一次空main::arr,并打印,因为它的空行。

Private variables via my() in perlsub

+0

参见“*首次使用时,它创建*” - 技术上解析器创建它当它第一次看到,不一定使用(例如'如果(0){打印@arr;}'将)在编译时创建'@main :: arr'(假设'no strict'))。 – melpomene

+0

@melpomene好点,我刚刚考虑改变它(同时做一个小编辑)!问题是,我被问到关于“_seen_”的使用问题(指编译器“看到”符号,我认为这是绝对清楚的)...现在改变了它,谢谢:) – zdim

相关问题