2009-08-06 12 views

Respuesta

30

Si se refiere a tomar la unión de sus datos, simplemente:

%c = (%a, %b); 
+0

¿Por qué no% a = (% a,% b); ¿trabajo? % a se "borra" – biznez

+3

Funciona para mí: "% a = ('a' => 'b', 'c' => 1);% b = ('c' => 'd');% a = (% a,% b); print join (',', map {"'$ _' => \" $ {a {$ _}} \ ""} teclas% a), "\ n"; " Los elementos de% b con la misma clave tienen prioridad, pero otros elementos de% a están presentes después de la unión. – outis

+4

@yskhoo: funciona. – ysth

23

También puede utilizar rebanadas de fusionar uno de hash a la otra;

@a{keys %b} = values %b; 

Tenga en cuenta que los elementos de% b se sobrescribir elementos en% a que tienen la misma clave.

+5

Para obtener crédito adicional, con una referencia de hash en ayb, hacemos @ {$ a} {claves% $ b} = valores% $ b; – daotoad

+2

Espero que esto sea más eficiente que la otra respuesta, porque esa recrea el hash también para los elementos ya existentes, mientras que este solo agrega claves para los nuevos elementos. Si hubo muchos elementos en% a, en comparación con% b, la diferencia puede ser respetable. – bart

+1

Quizás. Mi enfoque también camina% b dos veces. Si% b es mayor que% a, la otra técnica podría ser más rápida. El más rápido de todos podría ser un bucle, pero el OP no quería eso. – outis

2

Esto combinará hashes y también tendrá en cuenta las entradas no definidas, por lo que no reemplazan el contenido.

my %hash = merge(\%hash1, \%hash2, \%hash3); 

sub merge { 
    my %result; 

    %result = %{ $_[0] }; 
    shift; 

    foreach my $ref (@_) { 
     for my $key (keys %{$ref}) { 
      if (defined $ref->{$key}) { 
       $result{$key} = $ref->{$key}; 
      } 
     } 
    } 

    return %result; 
} 
2
my %c = %a; 
map {$c{$_} = $b{$_}} keys %b; 
Cuestiones relacionadas