2012-06-13 15 views
11

Ich habe zwei Hashes, eine große und eine kleine. Alle kleineren Hash-Schlüssel werden in dem größeren Hash angezeigt, aber die Werte sind unterschiedlich. Ich möchte die Werte vom größeren Hash in kleineren Hash kopieren.Kopieren von Werten von einem Hash zu einem anderen in Perl

Beispiel:

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

Eine offensichtliche Antwort auf eine Schleife durch die Tasten des kleinen Hash sein würde, und kopieren Sie die Werte wie diese

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

Gibt es einen kürzeren Weg, dies zu tun ?

+2

Fix Code: Hash-Tabellen gehen mit '()', nur Hash-Tabelle Referenzen gehen mit '{}'. – Lumi

+0

Oops Entschuldigung, behoben. –

Antwort

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

Wahrscheinlich haben Sie recht, wenn Sie annehmen, dass sich die Reihenfolge der 'keys% hash' nicht zwischen den Anrufen ändert, aber kann das garantiert werden? – Qtax

+1

Das OP schrieb: "Ich möchte die Werte aus dem größeren Hash in kleineren Hash kopieren." Angenommen, er möchte nur die Werte von Schlüsseln kopieren, die auch in% small_hash enthalten sind, ist dies die richtige Lösung. – Lumi

+0

Ja, die Reihenfolge der 'Schlüssel' wird garantiert nicht geändert. – 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

Funktioniert nicht, Quelle hat mehr Werte und OP wollte nur Werte für die gleichen Schlüssel kopieren. – Qtax

+0

@Qtax - Natürlich wird es funktionieren. Die Anzahl der Werte in '% source' ist nicht relevant. Und Ihr Kommentar über "gleiche Reihenfolge zwischen verschiedenen Hashes" macht keinen Sinn: Hash-Tabellen sind ungeordnet. Worauf ich mich beziehen sollte, ist die Reihenfolge in der Zuweisung, und es ist garantiert, dass sie für "Schlüssel" und "Werte" in ein und derselben Hash-Tabelle identisch ist. Führen Sie die Probe aus und denken Sie darüber nach; und dann vielleicht posten. – Lumi

+0

Warum versuchst du es nicht mit den gleichen Hashes wie im OP und siehst selbst, ob du das gewünschte Ergebnis bekommst. – Qtax

6

Hier ist eine Art und Weise Sie es tun könnte:

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

Altho, die for-Schleife die ziemlich ähnlich ist.

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

mapproof für diejenigen, die man braucht:

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; 

Ausgang:

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

Kein 'map'-Operator benötigt, um Werte von einer Tabelle in eine andere zu kopieren. – Lumi

+0

@Lumi, offensichtlich wissen Sie nicht, wie die Karte funktioniert. Diese Antwort funktioniert wie gewünscht. Versuchen Sie es zumindest, bevor Sie mit der Abstimmung beginnen. – Qtax

+0

@ Lumi, Beweis http://ideone.com/1PjLI Ja, gute Manieren, um richtige Antworten abzustimmen. – Qtax

Verwandte Themen