在嵌套哈希中分配值的最佳方法是什么?
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}
一样,它是对哈希元素的赋值。
我的代码构造了一个包含哈希引用的哈希 %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}
一样,它是对哈希元素的赋值。