使用 Perl 循环声明变量



我对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;
}

通常,@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数组的地址(的有效性?

非常感谢您的任何评论

高斯76

每次进入循环时,都会得到一个名为@Array_Vals的全新变量。这些变量中的每一个都将存在于内存的不同部分中,因此将具有不同的引用。您可以通过在循环中打印对数组(print @Array_Vals(的引用来验证这一点。

因此,您有一个新的数组变量,然后填充该变量。然后,您获取对该数组的引用并将该引用存储在另一个数组中。然后我们处于循环迭代的末尾,@Array_Vals超出了范围,不复存在。或者,更确切地说,变量的名称不复存在。当我们在@Array_of_All_Vals中存储对@Array_Vals的引用时,Perl 内部注意到这个引用存储在其他地方(我们说"引用计数增加了"(。虽然引用计数不为零,但 Perl 不会释放用于存储旧@Array_Vals数组的内存。

如果@Array_of_All_Vals数组超出范围,那么 Perl 将减少存储在其元素中的所有引用的引用计数。旧@Array_Vals数组上的引用计数将变为零,Perl 的垃圾收集将在将来的某个时候自由地重用该内存。

因此,您开发的机制可以保证正常工作。事实上,这是针对此类情况的推荐方法。

最新更新