使用Perl在循环中声明变量

6

我对Perl还比较陌生,最近写了下面的代码。我已经进行了广泛的测试,并且它返回了期望的结果。但是,我想知道更有经验的Perl开发者对其可用性是否有建议。

基本上,我在for循环内使用了'my'关键字声明了一个数组变量。然后,我在前面声明的另一个数组变量中使用了此声明的数组变量的地址。基本代码结构如下:

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数组的地址)的有效性?

非常感谢您的评论

Gauss76


不要回答,将此放入循环中 print \@Array_Vals, "\n"; 和循环后的 print "$_\n" for @Array_of_ALL_Vals; - mpapec
2
请注意@Сухой27的评论 - 这是一个好问题,但是您可以自己解决。 - zdim
谢谢,我会测试一下。 - gauss76
1个回答

6
每次进入循环时,您都会得到一个名为@Array_Vals的全新变量。这些变量将存储在不同的内存位置,并因此具有不同的引用。您可以通过在循环内部打印数组的引用(print \@Array_Vals)来验证这一点。
因此,您有一个新的数组变量,然后填充该数组。然后,您会获取该数组的引用并将其存储在另一个数组中。然后,循环迭代结束后,@Array_Vals超出范围并且不存在了。或者更准确地说,变量的名称不存在了。当我们将对@Array_Vals的引用存储在@Array_of_All_Vals中时,Perl内部会记录该引用被存储在其他位置(我们称之为“引用计数已增加”)。只要引用计数非零,Perl就不会释放用于存储旧的@Array_Vals数组的内存。
如果@Array_of_All_Vals数组曾经超出范围,那么Perl将逐个减少其元素中存储的所有引用的引用计数。旧的@Array_Vals数组的引用计数将归零,然后Perl的垃圾回收机制将在未来某个时候重新使用该内存。
因此,您开发的机制保证可以正常工作。实际上,这是处理这种情况的推荐方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接