用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

+0

而不是回答,把它放在循环'print \ @Array_Vals“中,\ n”;'和'print'$ _ \ n“替代@Array_of_ALL_Vals;'在循环之后。 –

+2

请注意@Сухой27的评论 - 这是一个很好的问题,但是你可以自己弄明白。 – zdim

+0

谢谢...我会测试它。 – 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的垃圾回收将在将来的某个时候*重新使用该内存。

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

+0

太棒了!非常感谢戴夫,非常优雅地解释! – gauss76