shared/comments/_form.html.erb
# my @arr;
for (1..100)
{
for (1..100)
{
for (1..100)
{
push @arr, 1;
}
}
}
的范围是什么?它是否与在顶部的注释行中声明的相同?
答案 0 :(得分:9)
@arr
是一个全局变量,在解析器第一次遇到它时创建,然后在整个包中看到。
use warnings;
#use strict;
for (1..3) {
#my @arr;
for ( qw(a b c) ) {
push @arr, $_;
}
}
print "@arr\n";
打印
a b c a b c a b c
这是关于全局变量的坏事之一,它们会辐射"整个代码。
启用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
是全局的(因此在代码中的任何地方都可以看到)。
在顶部用my
声明它将在此示例中具有相同的效果,但它与未声明的全局变量不同。 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
,以及打印后的空行。