1

如果我将哈希引用定义为:

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} 的内容。

谢谢。

4

1 回答 1

5

如果要清空嵌套哈希(但仍然存在哈希),则需要先取消引用它:

%{ $r_hash1->{c} } = ( );

或者,您可以在其位置分配一个空的 hashref:

$r_hash1->{c} = { };

在您的第二个示例中,如果您设置$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 = {};

这有点缩写(我没有打扰中间命名引用。)第一个转储显示%h1它对%h2. %h1在取消引用引用并将其清除后显示第二个转储。第三个转储显示%h2清除后的原始数据。

另一方面,如果您使用$h1{c} = { },原始%h2文件将不受影响,因为您只是替换 的值$h1{c}。它最初是对%h2; 现在它是对新匿名哈希的引用。

于 2013-04-08T16:59:21.443 回答