2012-06-13 140 views
11

我有兩個哈希值,一大一小。所有較小的散列鍵都顯示在較大的散列表中,但值不同。我想從較大的散列值複製到較小的散列值。將值從一個散列值複製到另一個散列值

EG:

# I have two hashes like so 
%big_hash = (A => '1', B => '2', C => '3', D => '4', E => '5'); 
%small_hash = (A => '0', B => '0', C => '0'); 
# I want small_hash to get the values of big_hash like this 
%small_hash = (A => '1', B => '2', C => '3'); 

一個明顯的答案是通過小散的鑰匙環,並複製值,這樣

foreach $key (keys %small_hash) { $small_hash{$key} = $big_hash{$key}; } 

有一個較短的方式做到這一點?

+2

修復代碼:哈希表去'()',只有哈希表引用去與'{}'。 – Lumi

+0

抱歉,這是固定的。 –

回答

16
@small_hash{ keys %small_hash } = @big_hash{ keys %small_hash }; 
+0

您可能正確地假設'keys%hash'的順序在調用之間不會改變,但是可以保證嗎? – Qtax

+1

OP寫道:「我想從較大的散列值複製到較小的散列值。」假設他只想複製'%small_hash'中包含的鍵的值,這是正確的解決方案。 – Lumi

+0

是的,'鍵'的順序保證不會改變。 – mob

-2
use strict; 
my %source = (a => 1, b => 2, c => 3); 
my %target = (a => -1, x => 7, y => 9); 

# Use a hash slice for the copy operation. 
# Note this will clobber existing values. 
# Which is probably what you intend here. 
@target{ keys %source } = values %source; 

for (sort keys %target) { 
    print $_, "\t", $target{ $_ }, "\n"; 
} 
+0

將無法​​工作,來源具有更多的值,並且OP只想複製相同鍵的值。 – Qtax

+0

@Qtax - 當然會起作用。 '%source'中的值的數量是不相關的。而關於「不同哈希之間的相同順序」的評論沒有意義:哈希表是無序的。我認爲你可能指的是賦值中的順序,並且它在同一個哈希表上的'keys'和'values'保證是相同的。運行樣本,然後思考;然後可能發佈。 – Lumi

+0

你爲什麼不用與OP中相同的哈希來嘗試它,並且如果你得到了期望的結果,那麼就看看你自己。 – Qtax

6

這裏有一個方法,你可以做到這一點:

%small = map { $_, $big{$_} } keys %small; 

本書雖然那是相當相似的循環。

$small{$_} = $big{$_} for keys %small; 

mapproof爲那些需要一個:

my %big = (A => '1', B => '2', C => '3', D => '4', E => '5'); 
my %small = (A => '0', B => '0', C => '0'); 

%small = map { $_, $big{$_} } keys %small; 

print join ', ', %small; 

輸出:

A, 1, C, 3, B, 2 
+0

沒有'map'操作符需要將值從一個表複製到另一個表。 – Lumi

+0

@Lumi,顯然你不知道地圖是如何工作的。這個答案根據需要工作。至少在開始投票前嘗試一下。 – Qtax

+0

@Lumi,證明http://ideone.com/1PjLI是的,良好的舉止投票正確的答案。 – Qtax

相關問題