6
$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并丢失引用。

4

2 回答 2

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 检查匿名哈希切片

于 2012-08-09T22:44:31.747 回答
7

使用哈希切片表示法。

 @$b{"d","e"} = (1,1);

 %newdata = (d => 1, e => 1);
 @$b{keys %newdata} = values %newdata;
于 2012-08-09T23:10:46.147 回答