2012-06-13 30 views
11

Tengo dos hashes, uno grande y uno pequeño. Todas las teclas hash más pequeñas aparecen en el hash más grande, pero los valores son diferentes. Quiero copiar los valores del hash más grande al hash más pequeño.Copiando valores de un hash a otro en perl

Ejem:

# 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 respuesta obvia sería colocar a través de las teclas de la pequeña almohadilla, y copiar los valores como esto

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

¿Hay un camino más corto para hacer esto ?

+2

Fije su código: tablas hash van con '()', sólo referencias de tabla de hash van con '{}'. – Lumi

+0

Vaya disculpa por eso, corregido. –

Respuesta

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

Probablemente tenga razón al suponer que el orden de 'keys% hash' no cambiará entre llamadas, ¿pero puede garantizarse? – Qtax

+1

El OP escribió: "Quiero copiar los valores del hash más grande al hash más pequeño". Suponiendo que solo quiera copiar los valores de las claves que también figuran en '% small_hash', esta es la solución correcta. – Lumi

+0

Sí, se garantiza que el orden de 'keys' no cambiará. – 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

No funciona, la fuente tiene más valores, y OP solo quería copiar valores para las mismas claves. – Qtax

+0

@Qtax - Por supuesto que funcionará. La cantidad de valores en '% source' es irrelevante. Y su comentario sobre "mismo orden entre hashes diferentes" no tiene sentido: las tablas hash están desordenadas. A lo que creo que te refieres es a la orden en la tarea, y se garantiza que será idéntica tanto para las "claves" como para los "valores" en una misma tabla hash. Ejecute la muestra, luego piense; y luego tal vez publicar. – Lumi

+0

¿Por qué no lo intentas con los mismos valores hash que en el OP y lo ves por ti mismo si obtienes el resultado deseado? – Qtax

6

Aquí está una manera que podría hacerlo:

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

Altho que es bastante similar a la de bucle.

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

mapproof para aquellos que necesitan una:

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; 

Salida:

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

No se necesita un operador 'map' para copiar los valores de una tabla a otra. – Lumi

+0

@Lumi, obviamente no sabes cómo funciona el mapa. Esta respuesta funciona como se requiere. Al menos pruébalo antes de comenzar a votar. – Qtax

+0

@Lumi, prueba http://ideone.com/1PjLI Sí, buenos modales para votar las respuestas correctas. – Qtax

Cuestiones relacionadas