2012-06-13 13 views
11

Mam dwa hashe, jeden duży i jeden mały. Wszystkie mniejsze krzyżyki pojawiają się w większym haszu, ale wartości są różne. Chcę skopiować wartości z większego skrótu do mniejszego skrótu.Kopiowanie wartości z jednego hasha na inny w perlu

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'); 

Oczywistą odpowiedzią byłoby pętli poprzez klawisze małej hash i skopiować wartości jak ten

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

Czy istnieje krótsza droga to zrobić ?

+2

naprawić swój kod: tabele mieszania go z '()', tylko hash referencje tabeli przejść z '{}'. – Lumi

+0

Ups, przepraszam za to. –

Odpowiedz

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

Prawdopodobnie masz rację zakładając, że kolejność "kluczy% hash" nie zmieni się między połączeniami, ale czy można to zagwarantować? – Qtax

+1

OP napisał: "Chcę skopiować wartości z większego skrótu do mniejszego skrótu". Zakładając, że po prostu chce skopiować wartości kluczy zawarte również w '% small_hash', jest to poprawne rozwiązanie. – Lumi

+0

Tak, kolejność 'kluczy' jest gwarantowana, że ​​nie ulegnie zmianie. – 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

Nie będzie działać, źródło ma więcej wartości, a OP chce tylko kopiować wartości dla tych samych kluczy. – Qtax

+0

@ Qtax - Oczywiście, że będzie działać. Liczba wartości w '% source' jest nieistotna. A twój komentarz dotyczący "tej samej kolejności między różnymi hashe" nie ma sensu: tablice hash są nieuporządkowane. To, co myślę, że możesz mieć na myśli, to kolejność w zadaniu i gwarantuje się, że będzie identyczna dla obu "kluczy" i "wartości" na jednej i tej samej tabeli mieszania. Uruchom próbkę, a następnie zastanów się; a potem może post. – Lumi

+0

Dlaczego nie spróbujesz z tymi samymi hashe, jak w OP i przekonaj się, jeśli uzyskasz pożądany rezultat. – Qtax

6

Oto sposób można to zrobić:

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

Altho to dość podobna do pętli for.

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

mapproof dla tych, którzy potrzebują jednego:

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; 

wyjściowa:

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

Brak operatora 'map' potrzebnego do kopiowania wartości z jednej tabeli do drugiej. – Lumi

+0

@Lumi, oczywiście nie wiesz, jak działa mapa. Ta odpowiedź działa zgodnie z wymaganiami. Przynajmniej spróbuj, zanim zaczniesz głosowanie. – Qtax

+0

@Lumi, dowód http://ideone.com/1PjLI Tak, dobre maniery by głosować poprawnie. – Qtax

Powiązane problemy