4
# my @arr;
for (1..100)
{
for (1..100)
{
for (1..100)
{
push @arr, 1;
}
}
}
@arr
的范围是什么?它是否与在顶部的注释行中声明的一样?什么范围是深度代码中使用的未声明变量?
# my @arr;
for (1..100)
{
for (1..100)
{
for (1..100)
{
push @arr, 1;
}
}
}
@arr
的范围是什么?它是否与在顶部的注释行中声明的一样?什么范围是深度代码中使用的未声明变量?
@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
,并打印,因为它的空行。
参见“*首次使用时,它创建*” - 技术上解析器创建它当它第一次看到,不一定使用(例如'如果(0){打印@arr;}'将)在编译时创建'@main :: arr'(假设'no strict'))。 – melpomene
@melpomene好点,我刚刚考虑改变它(同时做一个小编辑)!问题是,我被问到关于“_seen_”的使用问题(指编译器“看到”符号,我认为这是绝对清楚的)...现在改变了它,谢谢:) – zdim