$a = {b=>{c=>1}}; # set up ref
$b = $a->{b}; # ref the ref
$b .= (d=>1,e=>1); # where we want to assign multiple key/val at once
最后$a
应如下所示:
{
'b' => {
'c' => 1,
'd' => 1,
'e' => 1
}
};
最后$b
应如下所示:
{
'c' => 1,
'd' => 1,
'e' => 1
}
注意:与执行相同:
$b->{d} = 1;
$b->{e} = 1;
$b = { %$b, d=>1, e=>1 };
不需要,因为它会创建$a
的副本并丢失参考。
答案 0 :(得分:8)
%{$b} = ( d => 1, e => 1 );
您只需取消引用匿名hash-ref,使其看起来像赋值运算符的哈希值。
你甚至可以这样做:
%{$b} = ( %{$b}, d => 1, e => 1 );
在这些情况下,%{$b}
%$b
只是视觉上的便利(尽管在某些情况下可能是语法消歧)。
......或者你可以......
foreach ( qw/ d e / ) {
$b->{$_} = 1;
}
显然,你可能不打算将“1”的值分配给所有东西。那么切片怎么样:
@{$b}{ qw/ d e / } = ( 1, 1 );
在perldoc perldata中讨论了切片,但是对于采用匿名散列切片并没有很好的perldoc描述。为此,您必须与所有关于引用的Perl文档达成协议,然后推断如何将其应用于切片语法。 ...或者在PerlMonks上查看anonymous hash slices。
答案 1 :(得分:7)
使用散列切片表示法。
@$b{"d","e"} = (1,1);
%newdata = (d => 1, e => 1);
@$b{keys %newdata} = values %newdata;