gau*_*s76 6 perl for-loop variable-declaration
我是Perl的新手,最近生成了以下代码.我已对其进行了广泛测试,并返回了所需的结果.但是我只是想知道是否有更多Perl经验的人可以就其可用性向我提出建议.
基本上,我在for循环中声明了一个带有'my'关键字的数组变量.然后,我在另一个已在前面提到的for循环之前声明的数组变量中使用此声明的数组变量的地址.基本代码结构如下所示:
my @Array_of_ALL_Vals;
for my $iloop (0 .. 10){
my @Array_Vals;
.
Code in here to populate @Array_of_Vals
.
push @Array_of_ALL_Vals,\@Array_Vals;
}
Run Code Online (Sandbox Code Playgroud)
通常,@ Array_Vals变量每次都有不同的大小.此外,在循环中定义的数组@Array_Vals不会在代码中的任何其他位置使用,并且是for循环的本地.
我关心的是在for循环中声明数组.即使每次我假设每次循环迭代时变量的名称都相同,它也会被分配给不同的内存地址.它是否正确?
我认为最好在for循环中为数组名添加一个增量器,这样每次名称都会不同(@ Array_Vals1,@ Array_Vals2,...).然后我可以将这些值推送到@Array_of_ALL_Vals数组中,并确保不会覆盖最终的数组值.但是在做了一些搜索之后,我发现不鼓励这样的方法(包含变量的变量名).
所以我想我要问的是:我的方法是为每个循环迭代使用相同的数组名称,然后将此数组的地址附加到新数组(@Array_of_ALL_Vals)有效吗?或者,在执行所有迭代后,循环数组(@Array_Vals)不断被覆盖的事实是否会破坏我的数组@Array_of_ALL_Vals(其中包含@Array_Vals数组的地址)的有效性?
非常感谢任何评论
Gauss76
每次进入循环时,都会得到一个名为的全新变量@Array_Vals.这些变量中的每一个都将存在于存储器的不同部分中,因此具有不同的参考.您可以通过print \@Array_Vals在循环内打印对数组()的引用来验证这一点.
所以你有一个新的数组变量,然后你可以填充它.然后你引用该数组并将引用存储在另一个数组中.然后我们在循环迭代结束@Array_Vals时超出范围而不再存在.或者,相反,变量的名称不再存在.当我们存储对@Array_Valsin 的引用时@Array_of_All_Vals,Perl在内部做了一个注释,这个引用存储在别处(我们说"引用计数增加了").虽然引用计数不为零,但Perl不会释放用于存储旧@Array_Vals数组的内存.
如果@Array_of_All_Vals数组要超出范围,那么Perl将减少存储在其元素中的所有引用的引用计数.旧@Array_Vals数组的引用计数将变为零,Perl的垃圾收集可以在将来某个时候自由地重用该内存.
所以,你开发的机制保证工作正常.事实上,这是这种情况的推荐方法.