2012-06-13 19 views
11

Ho due hash, uno grande e uno piccolo. Tutte le chiavi di hash più piccole appaiono nell'hash più grande, ma i valori sono diversi. Voglio copiare i valori dall'hash più grande all'hash più piccolo.Copia di valori da un hash all'altro in perl

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

Una risposta ovvia sarebbe quella di collegare attraverso i tasti del piccolo hash, e copiare i valori come questo

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

C'è un modo più breve per fare questo ?

+2

Correggi il tuo codice: tabelle hash vanno con '()', solo riferimenti di tabella hash vanno con '{}'. – Lumi

+0

Oops mi dispiace, risolto. –

risposta

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

Probabilmente hai ragione nel ritenere che l'ordine di "chiavi% hash" non cambierà tra le chiamate, ma può essere garantito? – Qtax

+1

L'OP ha scritto: "Voglio copiare i valori dall'hash più grande all'hash più piccolo." Supponendo che voglia solo copiare i valori delle chiavi contenute anche in '% small_hash', questa è la soluzione corretta. – Lumi

+0

Sì, l'ordine di "chiavi" è garantito per non cambiare. – 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

Non funziona, l'origine ha più valori e OP voleva solo copiare valori per le stesse chiavi. – Qtax

+0

@Qtax - Certo che funzionerà. Il numero di valori in "% source" è irrilevante. E il tuo commento sullo "stesso ordine tra diversi hash" non ha senso: i tavoli hash sono disordinati. Quello a cui penso si potrebbe riferire è l'ordine nel compito, ed è garantito che sia identico sia per 'keys' che' values' su una stessa hash table. Esegui il campione, poi pensa; e quindi magari postare. – Lumi

+0

Perché non provarlo con gli stessi hash dell'OP e vedere se stessi se ottieni il risultato desiderato. – Qtax

6

Ecco un modo si potrebbe fare:

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

Altho che è abbastanza simile al ciclo for.

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

mapproof per coloro che hanno bisogno di uno:

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; 

uscita:

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

Nessun operatore 'map' necessario per copiare i valori da una tabella a un'altra. – Lumi

+0

@Lumi, ovviamente non sai come funziona la mappa. Questa risposta funziona come richiesto. Almeno provalo prima di iniziare a votare. – Qtax

+0

@Lumi, prova http://ideone.com/1PJLI Sì, le buone maniere per il down votano risposte corrette. – Qtax