Risposte:
% hash1 = (% hash1,% hash2) ## o altro ... @ hash1 {keys% hash2} = values% hash2; ## o con riferimenti ... $ hash_ref1 = {% $ hash_ref1,% $ hash_ref2};
undef
, zero, stringa vuota false
,, falsy ...)1 * (aka array associativo , aka dizionario )
%hash1 = (%hash1, %hash2)
$hash_ref1
a $hash_ref2
, no fusione. Se vuoi $hash_ref1 = { %$hash_ref1, %$hash_ref2 };
, modifico la risposta.
Dai un'occhiata a perlfaq4: come unisco due hash . Ci sono già molte buone informazioni nella documentazione di Perl e puoi averle subito piuttosto che aspettare che qualcun altro risponda. :)
Prima di decidere di unire due hash, devi decidere cosa fare se entrambi gli hash contengono chiavi uguali e se vuoi lasciare gli hash originali come erano.
Se vuoi conservare gli hash originali, copia un hash (% hash1) in un nuovo hash (% new_hash), quindi aggiungi le chiavi dell'altro hash (% hash2 al nuovo hash. Controllando che la chiave esista già in% new_hash ti dà la possibilità di decidere cosa fare con i duplicati:
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};
}
}
Se non vuoi creare un nuovo hash, puoi comunque usare questa tecnica di loop; basta cambiare% new_hash in% 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};
}
}
Se non ti interessa che un hash sovrascrive chiavi e valori dall'altro, puoi semplicemente usare una fetta di hash per aggiungere un hash a un altro. In questo caso, i valori di% hash2 sostituiscono i valori di% hash1 quando hanno chiavi in comune:
@hash1{ keys %hash2 } = values %hash2;
Questa è una vecchia domanda, ma emerge in cima alla mia ricerca su Google per 'perl merge hash' - e tuttavia non menziona l'utilissimo modulo CPAN Hash :: Merge