Perl子例程中的变量不会释放内存

我有一个关于子程序中的变量何时以及如何释放内存的问题.该脚本是一个例子:

#!perl/bin/per
use strict;
sub A{
    my $x= shift;
    return ([$x]);
}
for my $i (1..10){
    my $ref= &A($i);## the input changes in each round
    my $ref2= &A(9);## the input is fixed in each round
    print "$ref\t";
    print "$ref2\n";
}

并且屏幕上的输出是:

ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)

我预计在子程序A被调用多次时应该更改引用,但无论何时更改输入,输出引用都是固定的.这种现象是否可以推断,在整个脚本结束之前,子程序中变量占用的内存永远不会被释放?否则,我的结果是不寻常的?

解决方法

>对A($i)的调用在perl认为方便可用的任何位置分配新的arrayref.
>该数组引用返回到您的循环体,并存储在一个词法范围到该循环体的变量中.
>在循环的底部,变量超出范围,并且由于没有其他内容引用该arrayref,因此释放了arrayref.
>因此,以前保存arrayref的内存位置再次方便可用,并在下次需要时重新使用…在下次调用A()时
>转到1

如果阻止数组被释放,您将看到在不同地址创建的新数组.

my @a;
for my $i (1..10){
    my $ref= &A($i);## the input changes in each round
    my $ref2= &A(9);## the input is fixed in each round
    print "$ref\t";
    print "$ref2\n";
    push @a,$ref,$ref2;
}

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...