perl dictionary hash merge

¿Cómo puedo combinar hashes en Perl?



dictionary merge (4)

Respuesta rápida (TL; DR)

%hash1 = (%hash1, %hash2) ## or else ... @hash1{keys %hash2} = values %hash2; ## or with references ... $hash_ref1 = { %$hash_ref1, %$hash_ref2 };

Visión de conjunto

  • Contexto: Perl 5.x
  • Problema: el usuario desea fusionar dos hashes 1 en una sola variable

Solución

  • use la sintaxis anterior para variables simples
  • utilice Hash :: Merge para variables anidadas complejas

Trampas

  • Qué hacer cuando ambos hashes contienen una o más claves duplicadas
    • ¿Debería un par clave-valor con un valor vacío sobrescribir alguna vez un par clave-valor con un valor no vacío?
    • ¿Qué constituye un valor vacío versus no vacío en primer lugar? (por ejemplo, undef , string vacío, false , falsy ...)
    • (Nota: la pregunta original descarta este escenario, pero es importante considerarlo)

Ver también

Notas a pie de página

1 * (también conocido associative-array , también conocido como dictionary )

¿Cuál es la mejor manera de combinar ambos hashes en% hash1? Siempre sé que% hash2 y% hash1 siempre tienen claves únicas. También preferiría una sola línea de código si es posible.

$hash1{''1''} = ''red''; $hash1{''2''} = ''blue''; $hash2{''3''} = ''green''; $hash2{''4''} = ''yellow'';


Esta es una vieja pregunta, pero sale muy bien en mi búsqueda en Google de ''perl merge hashes'', y sin embargo, no menciona el muy útil módulo CPAN Hash :: Merge


Mira perlfaq4: ¿Cómo fusiono dos hash ? Ya hay mucha información buena en la documentación de Perl y puede tenerla de inmediato en lugar de esperar que alguien más la responda. :)

Antes de decidir fusionar dos hashes, debe decidir qué hacer si ambos hash contienen claves que son iguales y si desea dejar los hashes originales tal como estaban.

Si desea conservar los valores hash originales, copie un hash (% hash1) en un nuevo hash (% new_hash) y luego agregue las claves del otro hash (% hash2 al nuevo hash. Compruebe que la clave ya existe en% new_hash te da la oportunidad de decidir qué hacer con los duplicados:

my %new_hash = %hash1; # make a copy; leave %hash1 alone foreach my $key2 ( keys %hash2 ) { if( exists $new_hash{$key2} ) { warn "Key [$key2] is in both hashes!"; # handle the duplicate (perhaps only warning) ... next; } else { $new_hash{$key2} = $hash2{$key2}; } }

Si no desea crear un hash nuevo, puede seguir utilizando esta técnica de bucle; simplemente cambie el% new_hash a% hash1.

foreach my $key2 ( keys %hash2 ) { if( exists $hash1{$key2} ) { warn "Key [$key2] is in both hashes!"; # handle the duplicate (perhaps only warning) ... next; } else { $hash1{$key2} = $hash2{$key2}; } }

Si no le importa que un hash sobrescriba las claves y los valores del otro, puede usar una porción hash para agregar un hash a otro. En este caso, los valores de% hash2 reemplazan los valores de% hash1 cuando tienen claves en común:

@hash1{ keys %hash2 } = values %hash2;


Para referencias hash. Debes usar llaves

$hash_ref1 = {%$hash_ref1, %$hash_ref2};

en lugar de la respuesta sugerida anterior utilizando paréntesis

$hash_ref1 = ($hash_ref1, $hash_ref2);