2014-03-12 158 views
2

是否可以合併兩個哈希值,像這樣:Perl的合併哈希

%one = { 
    name => 'a', 
    address => 'b' 
}; 

%two = { 
    testval => 'hello', 
    newval => 'bye'   
}; 

$one{location} = %two; 

所以最終散列看起來是這樣的:

%one = { 
    name => 'a', 
    address => 'b', 
    location => { 
     testval => 'hello', 
     newval => 'bye' 
    } 
} 

我有一個期待,但不能確定這是否能沒有for循環完成。謝謝:)

+4

'%hash = {key => value}'語法錯誤(您是否使用警告?)。 '{...}'定義了一個*哈希引用*。你要麼說'%hash =(key => value,...)'或'$ hashref = {key => value,...}' – mob

+0

你的外層應該是()s。 ()使散列,{}使散列參考。 – mwarin

回答

6

由於散列元素的值是標量,所以不能在散列中存儲散列,但可以將引用存儲到散列中。 (同去的存儲陣列和存儲到數組。)

my %one = (
    name => 'a', 
    address => 'b', 
); 

my %two = (
    testval => 'hello', 
    newval => 'bye',  
); 

$one{location} = \%two; 

相同

my %one = (
    name => 'a', 
    address => 'b', 
    location => { 
     testval => 'hello', 
     newval => 'bye', 
    }, 
); 
+0

應該說*不是標量*? –

+0

@Hunter McMillen,不,就像我說的,他們*是*標量,這就是爲什麼你不能在其中存儲散列或數組。 – ikegami

+0

完美,謝謝! – AkshaiShah

3

如果使用

$one{location} = \%two 

那麼你的哈希將包含一個參考到哈希%two,所以如果你修改它像$one{location}{newval} = 'goodbye'然後%two也將被改變。

如果你想在%two數據的單獨副本那麼你需要寫

$one{location} = { %two } 

之後的%one內容是獨立的%two,可以單獨修改。

+0

'{%two}'很少需要,因爲'my%2'的正確放置通常會在需要時處理創建新的哈希。 – ikegami