Perl 通过对那块内存的计数来跟踪一块内存是否被使用。如果我这样做:
my $ref->{this}->{is}->{a}->{deep} = "hash";
undef $ref; # Note I use "undef" and not "delete"
我释放了所有的内存。所有哈希引用和这些哈希引用指向的实际标量。那是因为我没有其他方法可以访问该内存。
如果我做一些更简单的事情:
my %hash = ( one => 1, two => 2, ref => { three => 3, four => 4 }, five => 5 );
请注意,$hash{ref} 是对另一个哈希的引用。如果我这样做:
my $ref = $hash{ref};
我现在有两个变量可以访问那块内存。这样做:
delete $hash{ref};
不会释放该内存,因为$ref 仍然指向它。但是,该哈希引用不再在我的 %hash 哈希中。
如果我没有删除$hash{ref},而是这样做了:
$ref->{seven} = 7;
我更改了%hash,因为$ref 和$hash{ref} 指向同一块内存:相同的哈希引用。这样做:
delete $hash{ref}->{four};
或
删除 $ref->{four};
都将删除该哈希引用中的特定条目。
我们也不必做那么复杂的事情:
my %hash = ( one => 1, two => 2, three => 3 );
my $ref = \%hash; #Creating a reference to that hash
delete $ref->{three};
这将删除 $hash{three} 因为两者都指向内存中的相同哈希。然而,
undef $ref;
也不会取消定义$hash。
我希望这涵盖了您的问题。只要有另一种方式来引用内存位置,它就不会在 Perl 中被释放。但是,如果您指向一个数据结构的引用,则通过引用操作该数据结构将操作通过数组或哈希变量引用的该数据结构。