2010-08-03 3 views
6

Dato un hash in Perl (qualsiasi hash), come posso estrarre i valori da tale hash, nell'ordine in cui sono stati aggiunti e metterli in un array?Come posso estrarre i valori hash in una matrice nel loro ordine di inserimento?

Esempio:

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

voglio ottenere il seguente risultato:

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

Inizialmente, avevo dato la risposta corretta a @ MB14, ma l'unica cosa da fare era democratico di prendere di nuovo e dare a Zaid, a causa dell'elevato numero di voti. – Tom

risposta

2

È possibile utilizzare values, ma penso che non si può ottenere loro nel giusto ordine, come l'ordine è già stato perso quando hai creato l'hash

+1

La documentazione su http://perldoc.perl.org/functions/values.html è d'accordo con te: i valori vengono restituiti in un ordine apparentemente casuale. L'ordine casuale effettivo è soggetto a modifiche nelle future versioni di Perl. – Tom

+0

Fintanto che Hash non è OrderedHash (come OrderedHash in ruby) l'ordine è perso ... Quello che puoi fare è memorizzare l'elenco (foo, 10, bar, 20, 15) e convertirlo in un hash quando necessario – mb14

+0

Il titolo della domanda è cambiato e quindi la domanda, quindi la mia risposta non ha senso ora – mb14

5

Quanto segue farà quello che vuoi:

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

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

NB: una soluzione ancora migliore è utilizzare Tie::IxHash o Tie::Hash::Indexed per ordinare l'ordine di conservazione.

3

Se si dispone di un elenco di chiavi nel giusto ordine, è possibile utilizzare una fetta hash:

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

In caso contrario, utilizzare Tie::IxHash.