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