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 に答える