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;