2012-08-09 68 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