Fla*_*lau 1 perl hash nested clear
如果我将哈希引用定义为:
my %hash1=(
"a" => 1,
"b" => 2,
"c" => {
"d" => 4,
"e" => 5
}
);
my $r_hash1 = \%hash1;
Run Code Online (Sandbox Code Playgroud)
会使用:
$r_hash1->{c}=();
Run Code Online (Sandbox Code Playgroud)
清除%hash1 {c}中的键是否可以重用?
如果是这样,我也想知道我是否有:
my %hash1=(
"a" => 1,
"b" => 2
);
my %hash2=(
"d" => 4,
"e" => 5
);
my $r_hash1 = \%hash1;
my $r_hash2 = \%hash2;
$r_hash1->{"c"} = $r_hash2;
Run Code Online (Sandbox Code Playgroud)
是否使用:
$r_hash1->{c}=();
Run Code Online (Sandbox Code Playgroud)
释放%hash2使用的内存以供重用,因为它必须在哈希上下文中使用:
%$r_hash1->{c}
Run Code Online (Sandbox Code Playgroud)
但是这会在哈希上下文中查看$ r_hash1,而不是$ r_hash1 - > {c}的内容.
谢谢.
如果要清空嵌套的哈希(但仍然存在哈希),则需要首先取消引用它:
%{ $r_hash1->{c} } = ( );
Run Code Online (Sandbox Code Playgroud)
或者,您可以在其位置分配一个空的hashref:
$r_hash1->{c} = { };
Run Code Online (Sandbox Code Playgroud)
在你的第二个例子中,如果你设置$r_hash1->{c} = $r_hash2,然后清除它%{ $r_hash1->{c} } = ( ),%hash2 将清除所有内容.这是因为你提领$r_hash1->{c},这是一个副本$r_hash2,这是一个参考%hash2.
这是一个简单的程序,演示了结果:
perl -MData::Dumper -E '%h1 = ( a => 1, b => 2 ); %h2 = ( d => 4, e => 5 ); $h1{c} = \%h2; say Dumper \%h1; %{ $h1{c} } = ( ); say Dumper \%h1; say Dumper \%h2'
$VAR1 = {
'c' => {
'e' => 5,
'd' => 4
},
'a' => 1,
'b' => 2
};
$VAR1 = {
'c' => {},
'a' => 1,
'b' => 2
};
$VAR1 = {};
Run Code Online (Sandbox Code Playgroud)
这略有缩写(我没有打扰中间命名引用.)第一个转储显示%h1其引用%h2.第二个转储%h1在取消引用引用并清除之后显示.第三个转储%h2在清除之后显示原始转储.
另一方面,如果您使用$h1{c} = { },原件%h2将不受影响,因为您只是替换了值$h1{c}.它原本是一个参考%h2; 现在它是对新匿名哈希的引用.