$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,'e' => 1 }
注意:它与执行操作相同:
$b->{d} = 1; $b->{e} = 1;
$b = {%$b,d => 1,e => 1};不是所希望的,因为它会创建$a的副本并丢失引用.
解决方法
%{$b} = ( d => 1,e => 1 );
您只需取消引用匿名hash-ref,使其看起来像赋值运算符的哈希值.
你甚至可以这样做:
%{$b} = ( %{$b},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.