2012-08-09 29 views
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应该是这样的:的Perl:如何推键/值对到hashref和仍然保留的参考

  • { 
        '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副本,并失去了参考。

回答

8
%{$b} = (d => 1, e => 1); 

您只需取消引用匿名散列引用,使其看起来像散列到赋值运算符。

你甚至可以这样做:

%{$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

+0

是的,我在询问之前看过perldata,但找不到任何具体的东西 - 我很高兴你能从中解读出某些东西。坦率地说,我很惊讶'%{$ b} =(%{$ b},d => 1,e => 1);'工作了(它仍然对所引用的'$ a'应用了更改) – vol7ron 2012-08-10 14:01:59

+0

关于hashref片帮助我意识到' - >'不是必需的。使用'$ _'作为hashref,我尝试了'@ _-> {qw(key1 key2)}'这产生了一个神秘的错误信息:'不能使用未定义的值作为HASH引用' $ _} {qw(key1 key2)}' – Palec 2014-11-30 19:58:01

+0

@Palec这可能不会影响你在做什么,但是在你的例子中'@ _'和'@ $ _'有两个不同的含义 – vol7ron 2014-12-01 14:55:28

7

使用散列切片符号。

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

%newdata = (d => 1, e => 1); 
@$b{keys %newdata} = values %newdata; 
+0

+1,当然是啊哈希片。两个答案都是我需要的 - 我选择了David,因为在分配期间将键/ val保存在一行中。 - 谢谢,暴徒 – vol7ron 2012-08-10 14:03:35