Solución:
Los hash se contraen en listas planas cuando los pasa a la función. Entonces, cuando cambia un valor de los argumentos de la función, solo obtiene un valor. Lo que quieres hacer es pasar los hash por referencia.
do_stuff_with_hashes(%first_hash, %second_hash);
Pero luego tienes que trabajar con los hash como referencias.
my $first_hash = shift;
my $second_hash = shift;
Un poco tarde pero
Como se ha dicho, debe pasar referencias, no hash.
do_stuff_with_hashes(%first_hash, %second_hash);
Pero si necesita / quiere usar sus hashes como tal, puede desreferenciarlos inmediatamente.
sub do_stuff_with_hashes {
my %first_hash = %{shift()};
my %second_hash = %{shift()};
};
Las referencias hash son el camino a seguir, como han señalado los demás.
Proporcionar otra forma de hacer esto solo por diversión … porque ¿quién necesita variables temporales?
do_stuff_with_hashes( { gen_first_hash() }, { gen_second_hash() } );
Aquí solo está creando referencias hash sobre la marcha (a través de las llaves alrededor de las llamadas a la función) para usar en su función do_stuff_with_hashes. Esto no es nada especial, los otros métodos son igualmente válidos y probablemente más claros. Esto podría ayudar en el futuro si ve esta actividad en sus viajes como alguien nuevo en Perl.