用Perl声明变量循环
我对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数组的地址)的有效性?
的任何意见
Gauss76
每次输入你的循环时间非常感谢,你会得到一个名为@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的垃圾回收将在将来的某个时候*重新使用该内存。
因此,您开发的机制可以保证正常工作。事实上,这是这种情况的推荐方法。
太棒了!非常感谢戴夫,非常优雅地解释! – gauss76
而不是回答,把它放在循环'print \ @Array_Vals“中,\ n”;'和'print'$ _ \ n“替代@Array_of_ALL_Vals;'在循环之后。 –
请注意@Сухой27的评论 - 这是一个很好的问题,但是你可以自己弄明白。 – zdim
谢谢...我会测试它。 – gauss76