使用 Perl 在循环中声明变量
declare variable in loop with Perl
我对 Perl 还很陌生,最近编写了以下代码。我已经对它进行了广泛的测试,它 returns 达到了预期的结果。但是我只是想知道是否有更多 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
超出范围并不再存在。或者,更确切地说,变量的 name 不复存在。当我们在 @Array_of_All_Vals
中存储对 @Array_Vals
的引用时,Perl 在内部记录下该引用存储在别处(我们说 "the reference count was incremented")。虽然引用计数不为零,但 Perl 不会释放用于存储旧 @Array_Vals
数组的内存。
如果 @Array_of_All_Vals
数组超出范围,那么 Perl 将减少存储在其元素中的所有引用的引用计数。旧 @Array_Vals
数组的引用计数将变为零,并且 Perl 的垃圾收集器将在将来的某个时候自由地重新使用该内存。
所以,你开发的机制保证可以正常工作。事实上,这是针对这种情况的推荐方法。
我对 Perl 还很陌生,最近编写了以下代码。我已经对它进行了广泛的测试,它 returns 达到了预期的结果。但是我只是想知道是否有更多 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
超出范围并不再存在。或者,更确切地说,变量的 name 不复存在。当我们在 @Array_of_All_Vals
中存储对 @Array_Vals
的引用时,Perl 在内部记录下该引用存储在别处(我们说 "the reference count was incremented")。虽然引用计数不为零,但 Perl 不会释放用于存储旧 @Array_Vals
数组的内存。
如果 @Array_of_All_Vals
数组超出范围,那么 Perl 将减少存储在其元素中的所有引用的引用计数。旧 @Array_Vals
数组的引用计数将变为零,并且 Perl 的垃圾收集器将在将来的某个时候自由地重新使用该内存。
所以,你开发的机制保证可以正常工作。事实上,这是针对这种情况的推荐方法。