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

vol*_*ron 6 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
Run Code Online (Sandbox Code Playgroud)

它的结尾$a应该是这样的:

它的结尾$b应该是这样的:


注意:它与执行操作相同:

$b->{d} = 1;
$b->{e} = 1;
Run Code Online (Sandbox Code Playgroud)

$b = { %$b, d=>1, e=>1 };不是所希望的,因为它会创建一个副本$a并丢失引用.

Dav*_*idO 8

%{$b} = ( d => 1, e => 1 );
Run Code Online (Sandbox Code Playgroud)

您只需取消引用匿名hash-ref,使其看起来像赋值运算符的哈希值.

你甚至可以这样做:

%{$b} = ( %{$b}, d => 1, e => 1 );
Run Code Online (Sandbox Code Playgroud)

在这些情况下,%{$b}实际上只是一种视觉上的便利(尽管在某些情况下可能是一种语法消歧)%$b.

......或者你可以......

foreach ( qw/ d e / ) {
    $b->{$_} = 1;
}
Run Code Online (Sandbox Code Playgroud)

显然,你可能不打算将"1"的值分配给所有东西.切片怎么样:

@{$b}{ qw/ d e / } = ( 1, 1 );
Run Code Online (Sandbox Code Playgroud)

perldoc perldata中讨论了切片,但是对于采用匿名散列切片并没有真正好的perldoc描述.为此,您必须与所有关于引用的Perl文档达成协议,然后推断如何将其应用于切片语法....或者在PerlMonks上检查匿名哈希切片.


mob*_*mob 7

使用散列切片表示法.

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

 %newdata = (d => 1, e => 1);
 @$b{keys %newdata} = values %newdata;
Run Code Online (Sandbox Code Playgroud)