使用Perl

时间:2017-08-08 09:55:48

标签: 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;
}

@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

1 个答案:

答案 0 :(得分:6)

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

所以你有一个新的数组变量,然后你可以填充它。然后你引用该数组并将引用存储在另一个数组中。然后我们在循环迭代结束时@Array_Vals超出范围并且不再存在。或者说,变量的名称不再存在。当我们在@Array_Vals中存储对@Array_of_All_Vals的引用时,Perl在内部记下了此引用存储在其他位置(我们说"引用计数增加了#34;)。虽然引用计数不为零,但Perl不会释放用于存储旧@Array_Vals数组的内存。

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

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