gpt4 book ai didi

perl - 代码深处使用的未声明变量的作用域是什么?

转载 作者:行者123 更新时间:2023-12-04 17:31:42 26 4
gpt4 key购买 nike

# 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 ( qw(a b c) ) {
push @arr, $_;
}
}

print "@arr\n";

它打印

a b c a b c a b c

这是全局变量的坏处之一,它们在整个代码中“辐射”。

use strict;启用我们得到

在 scope.pl 第 11 行的字符串中可能意外插入了 @arr。
全局符号“@arr”需要在 scope.pl 第 7 行显式包名称。
全局符号“@arr”需要在 scope.pl 第 11 行显式包名称。
由于编译错误,scope.pl 的执行中止。

strict只是强制声明,这有意义地告诉我们 @arr是全局的(因此在代码中随处可见)。

my 声明它在此示例中,顶部将具有相同的效果,但它与未声明的全局变量不同。一个 my变量是词法的并且有作用域,最近的封闭块(或文件,这里)。来自 my

A my declares the listed variables to be local (lexically) to the enclosing block, file, or eval. If more than one variable is listed, the list must be placed in parentheses.



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

因此,当它在第一个循环(注释掉的行)内声明时,它在最后看不到(它不存在于该循环的块之外)。最后一行指向一个全局 @arr ,就在那里创建,从未分配给。我们确实收到了警告

在 scope.pl 第 11 行的字符串中可能意外插入了 @arr。
名称 "main::arr"仅使用一次:scope.pl 第 11 行可能有错别字。

关于空 main::arr使用一次,因为它被打印了一个空行。

另见 Private variables via my() in perlsub

关于perl - 代码深处使用的未声明变量的作用域是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42240668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com