在嵌套哈希中分配值的最佳方法是什么?

what is the best way to assign a value inside a nested hash?

我的代码构造了一个包含哈希引用的哈希 %oprAtnNOW,其中的键和值都在其中 $oprAtnNOW{opt} 是在 运行 时确定的。

下面的示例代码演示了单个命令足以从 $oprAtnNOW{opt}.

引用的匿名散列中提取 一个值

但是分配一个值不是那样的。 当我尝试将字符串 wolf 分配给键 Dog 时,发生了一些非常奇怪的事情。 当我使用 Dumper 查看结果时,分配的值似乎是 'wolf,并在字符串的开头粘贴了一个单引号; 当我使用 print 查看它时,它看起来像 SCALAR(something).

(我的代码结尾表明 'wolf 没有打印出 SCALAR(something),所以 Dumper 有其他想法。)

所以我的示例代码包含一个解决方法: 尊重匿名内部散列;在现在命名的临时散列中分配键和值;破坏前一个 $oprAtnNOW{opt} 引用临时的命名哈希。

为什么直接法会产生如此奇怪的结果?

这个SCALAR东西的真实内容是什么?

有没有办法只用一个命令就可以做到这一点,而不需要我的多步解决方法?

#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper qw(Dumper);
$Data::Dumper::Sortkeys = 1;

my %oprAtnNOW; 
${$oprAtnNOW{opt}{Dog}} = 'wolf'; 
print Dumper {%oprAtnNOW};
print join('', '$oprAtnNOW{opt}{Dog}==', $oprAtnNOW{opt}{Dog}, "\n",);

{
    my %tmp_oprAtnNOW_opt = %{$oprAtnNOW{opt}} if(defined $oprAtnNOW{opt});
    $tmp_oprAtnNOW_opt{Dog} = 'wolf'; # will clobber any previous value for Dog
    $oprAtnNOW{opt} = {%tmp_oprAtnNOW_opt};
}

print Dumper {%oprAtnNOW};
print join('', '$oprAtnNOW{opt}{Dog}==', $oprAtnNOW{opt}{Dog}, "\n",);

my $teststring = join('', "\x27", 'wolf',);
print "teststring==$teststring\n";


你想要

$oprAtnNOW{opt}{Dog} = 'wolf';

$BLOCK = EXPR; 期望 BLOCK 到 return 对标量的引用。

多亏了自动生成,如果需要会为您创建一个。也就是说,

${$oprAtnNOW{opt}{Dog}} = 'wolf';

的缩写
${ $oprAtnNOW{opt}{Dog} //= \my $anon } = 'wolf';

也可以写成

my $anon = 'wolf';
$oprAtnNOW{opt}{Dog} = $anon;

这不是你想要的。您不想分配对散列的引用;您要分配字符串 wolf。为此,您可以使用

$oprAtnNOW{opt}{Dog} = 'wolf';

这是

的简称
$oprAtnNOW{opt}->{Dog} = 'wolf';

又名

${ $oprAtnNOW{opt} }{Dog} = 'wolf';

后者的形式是

$BLOCK{Dog} = 'wolf';

$NAME{Dog} 一样,它是对哈希元素的赋值。