这是我要问的一些perl伪代码:
my %x;
# initialize %x
my $ref = whateverSyntacticSugarIsNeeded( $x{this}{hash}{is}{deep} );
# ...
# make use of $ref multiple times
# ...
delete $ref; # ideally, this would delete $x{this}{hash}{is}{deep}
......其中的想法是避免使用$x{this}{hash}{is}{deep}
而非绝对必要。
我非常确定这是不可能的,可能性最小的是2(值的初始引用/副本,然后从%x
删除键/值对)。但是,如果我错了,那么请随意纠正我。
答案 0 :(得分:2)
目前尚不清楚你想要什么。如果
%x = ( very => { deep => { hash => { is => "here" } } } );
并指定
$y = $x{very}{deep}{hash}{is}
然后就像写
$y = 'here'
所以你不能delete $y
。但是,你可以
$z = $x{very}{deep}{hash};
delete $z->{is};
答案 1 :(得分:1)
最简单的方法就是将哈希值引用一级。
如果您为变量赋予语义上合适的名称(除了ref之外的其他内容),则尤其如此:
my %x;
# initialize %x
my $ref = $x{this}{hash}{is};
# ...
# make use of $ref multiple times
# ...
delete $ref->{deep};
答案 2 :(得分:1)
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中释放。但是,如果指向对数据结构的引用,则通过引用操作该数据结构将操纵通过数组或哈希变量引用的数据结构。