Perl:清除嵌套哈希中的值
如果我将散列引用定义为:Perl:清除嵌套哈希中的值,perl,hash,nested,Perl,Hash,Nested,如果我将散列引用定义为: my %hash1=( "a" => 1, "b" => 2, "c" => { "d" => 4, "e" => 5 } ); my $r_hash1 = \%hash1; 将使用: $r_hash1->{c}=(); 要清除%hash1{c}中的键以便重用,请清除 如果是,我也想知道我是否: my %hash1=
my %hash1=(
"a" => 1,
"b" => 2,
"c" => {
"d" => 4,
"e" => 5
}
);
my $r_hash1 = \%hash1;
将使用:
$r_hash1->{c}=();
要清除%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;
是否使用:
$r_hash1->{c}=();
将释放%hash2使用的内存以供重用,因为它肯定必须在哈希上下文中使用:
%$r_hash1->{c}
但这将在哈希上下文中查看$r_hash1,而不是$r_hash1->{c}的内容
谢谢。如果要清空嵌套哈希(但哈希仍然存在),则需要先取消对其的引用:
%{ $r_hash1->{c} } = ( );
或者,您可以只在其位置分配一个空hashref:
$r_hash1->{c} = { };
在第二个示例中,如果设置$r_hash1->{c}=$r_hash2
,然后用%{$r_hash1->{c}}=()
清除它,则%hash2
中的内容将被清除。这是因为您正在取消引用$r\u hash1->{c}
,它是$r\u 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 = {};
这是稍微缩写的(我不介意中间命名的引用)。第一个转储显示%h1
,其引用是%h2
。在取消引用并清除引用后,第二次转储显示%h1
。第三次转储显示清除后的原始%h2
另一方面,如果使用
$h1{c}={}
,原始的%h2
将不受影响,因为您只是替换$h1{c}
的值。它最初是对%h2
的引用;现在它是对新匿名散列的引用。如果要清空嵌套散列(但仍存在该散列),则需要首先取消对它的引用:
%{ $r_hash1->{c} } = ( );
或者,您可以只在其位置分配一个空hashref:
$r_hash1->{c} = { };
在第二个示例中,如果设置$r_hash1->{c}=$r_hash2
,然后用%{$r_hash1->{c}}=()
清除它,则%hash2
中的内容将被清除。这是因为您正在取消引用$r\u hash1->{c}
,它是$r\u 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 = {};
这是稍微缩写的(我不介意中间命名的引用)。第一个转储显示%h1
,其引用是%h2
。在取消引用并清除引用后,第二次转储显示%h1
。第三次转储显示清除后的原始%h2
另一方面,如果使用
$h1{c}={}
,原始的%h2
将不受影响,因为您只是替换$h1{c}
的值。它最初是对%h2
的引用;现在它引用了一个新的匿名哈希。谢谢,我不确定使用{}是否会影响优先级;很抱歉,漏掉了一行-更正它。谢谢,我不确定使用{}会影响优先级;很抱歉,漏掉了一行-更正了它。在第二个问题中,您定义了$r\u hash1两次,我想您的意思是定义my$r\u hash2=\%hash2
在第二个问题中,您定义了$r\u hash1两次,我想您的意思是定义my$r\u hash2=\%hash2代码>