首页 文章

使用Perl在循环中声明变量

提问于
浏览
6

我是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 回答

  • 6

    每次进入循环时,都会得到一个名为 @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的垃圾收集可以在将来的某个时刻自由地重用该内存 .

    所以,你开发的机制保证工作正常 . 事实上,这是这种情况的推荐方法 .

相关问题