¿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
- Publicación de PM sobre hashes de fusión
- PM Categorical Q & A hash union
- Perl Cookbook 5.10. Fusionando hashes
- websearch: // perlfaq "fusionar dos hashes"
- websearch: // perl merge hash
- https://metacpan.org/pod/Hash::Merge
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);