Perl 删除对可用内存的引用

Perl 删除对可用内存的引用,perl,memory,reference,Perl,Memory,Reference,假设我有一个引用,它指向一个数组,该数组包含许多数组。例: my @main_array = ( [1,2,3], [3,4,5], ['a','b','c'] ); my $reference = \@main_array 如果以后我使用了该数组中的数据,并且只有对它的引用,那么删除该数组并释放内存的最佳方法是什么? 我通常执行以下操作来释放简单数组中数据使用的内存: undef @array 但因为我只参考了它,所以我考虑过这样做 undef @{$reference} 如果我这样做,

假设我有一个引用,它指向一个数组,该数组包含许多数组。例:

my @main_array = ( [1,2,3], [3,4,5], ['a','b','c'] );
my $reference = \@main_array
如果以后我使用了该数组中的数据,并且只有对它的引用,那么删除该数组并释放内存的最佳方法是什么? 我通常执行以下操作来释放简单数组中数据使用的内存:

undef @array
但因为我只参考了它,所以我考虑过这样做

undef @{$reference}
如果我这样做,我会删除对数组中存储的匿名数组(
main\u array
)的引用,而不是匿名数组的实际内容吗

我想我的问题可以简化为:删除引用是否会使Perl释放引用所引用的数组、哈希或标量所使用的内存


谢谢

是的,
undef@{$reference}
(或
undef@$reference
)将执行
undef@array
所做的操作。它将释放阵列使用的几乎所有内存,以供程序重用


但很少有什么好的理由这样做。当您的词法
$reference
超出范围时,同样的事情也会发生。首先显式地调用
undef
,只会使您的代码慢一分钟。

是的,
undef{$reference}
(或
undef@$reference
)将执行
undef@array
所做的操作。它将释放阵列使用的几乎所有内存,以供程序重用

但很少有什么好的理由这样做。当您的词法
$reference
超出范围时,同样的事情也会发生。首先显式地调用它的
unde
,只会使代码慢一分钟

如果以后我使用了该数组中的数据,并且只有对它的引用,那么删除该数组并释放内存的最佳方法是什么

理想情况下,只需让
$reference
超出范围即可。否则,您可以使用
$reference=undef

如果以后我使用了该数组中的数据,并且只有对它的引用,那么删除该数组并释放内存的最佳方法是什么


理想情况下,只需让
$reference
超出范围即可。否则,您可以使用
$reference=undef

相关:,“我通常执行以下操作来释放简单数组中数据使用的内存:
undef@array
”请不要这样做。它通常是毫无意义和不必要的。相关:,“我通常做以下操作来释放简单数组中数据使用的内存:
unde@array
”请不要这样做。这通常是毫无意义和不必要的。我应该提到,我的数组有大量的项,并且它在脚本运行的整个时间内都有效。这是因为脚本需要从不同的来源收集数据,所有这些数据都需要在脚本的最后处理,所以我必须将数据保存在内存中。有些部分我必须创建子数组,而这些子数组正是我试图删除以释放内存并避免重复数据的部分。。感谢you@JohnnyLoo:如果您有临时数据,则应通过使用
my
声明该数据并限制其范围来限制其生存期,以便自动丢弃该数据。明确使用
undef
通常是设计不佳的标志。如果您的数据太大,那么您最好使用内存中的SQLite数据库。我应该提到,我的数组有大量的项,并且它在脚本运行的整个时间内都有效。这是因为脚本需要从不同的来源收集数据,所有这些数据都需要在脚本的最后处理,所以我必须将数据保存在内存中。有些部分我必须创建子数组,而这些子数组正是我试图删除以释放内存并避免重复数据的部分。。感谢you@JohnnyLoo:如果您有临时数据,则应通过使用
my
声明该数据并限制其范围来限制其生存期,以便自动丢弃该数据。明确使用
undef
通常是设计不佳的标志。如果数据太大,那么最好使用内存中的SQLite数据库。