Perl:如何将键/值对推送到hashref并仍然保留引用

时间:2012-08-09 22:33:33

标签: perl hashref

$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的副本并丢失参考。

2 个答案:

答案 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;