2010-08-03 10 views
6

Dado un hash en Perl (cualquier hash), ¿cómo puedo extraer los valores de ese hash, en el orden en que se agregaron y ponerlos en una matriz?¿Cómo puedo extraer valores hash en una matriz en su orden de inserción?

Ejemplo:

my %given = (foo => '10', bar => '20', baz => '15'); 

Quiero obtener el siguiente resultado:

my @givenValues = (10, 20, 15); 
+0

Inicialmente, había dado la respuesta correcta a @ MB14, pero la única cosa que hacer era democrática de tomar de nuevo y darle a Zaid, debido al alto número de votos. – Tom

Respuesta

2

Puede utilizar values, pero creo que no se puede conseguir en el orden correcto, como el orden ya se ha perdido cuando creó el hash

+1

La documentación en http://perldoc.perl.org/functions/values.html está de acuerdo con usted: los valores se devuelven en un orden aparentemente aleatorio. El orden aleatorio real está sujeto a cambios en versiones futuras de Perl. – Tom

+0

Mientras Hash no esté OrderedHash (como OrderedHash en ruby) la orden se pierde ... Lo que puede hacer es almacenar la lista (foo, 10, bar, 20, 15) y convertirla a hash cuando sea necesario – mb14

+0

El título de la pregunta cambió y entonces la pregunta, entonces mi respuesta no tiene sentido ahora – mb14

5

Lo siguiente hará lo que desee:

my @orderedKeys = qw(foo bar baz); 
my %records  = (foo => '10', bar => '20', baz => '15'); 

my @givenValues = map {$records{$_}} @orderedKeys; 

NB: Una solución aún mejor es usar Tie::IxHash o Tie::Hash::Indexed para conservar el orden de inserción.

3

Si usted tiene una lista de teclas en el orden adecuado, se puede utilizar una rebanada de hash:

my @keys = qw(foo bar baz); 
my %given = {foo => '10', bar => '20', baz => '15'} 
my @values = @given{@keys}; 

De lo contrario, utilice Tie::IxHash.

Cuestiones relacionadas