gpt4 book ai didi

perl - 使用 Perl 在循环中声明变量

转载 作者:行者123 更新时间:2023-12-02 17:34:47 25 4
gpt4 key购买 nike

我对 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 的垃圾收集将在将来的某个时刻自由地重新使用该内存。

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

关于perl - 使用 Perl 在循环中声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45565169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com