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 ответа

Решение
%{$b} = ( d => 1, e => 1 );

Вы просто отменяете ссылку на анонимный хэш-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.

Используйте обозначение среза хеша.

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

 %newdata = (d => 1, e => 1);
 @$b{keys %newdata} = values %newdata;
Другие вопросы по тегам