2011-11-15 11 views
15

Ho una domanda che sembra semplice, ma non riesco a capirlo. Dì che ho un riferimento all'hash in Perl. Voglio ottenere una matrice di valori attraverso una serie di chiavi.Perl: Hash ref che accede alla serie di chiavi

Ecco come sarebbe lavorare con un hash, non un riferimento hash:

my %testHash = ("a" => 1, "b" => 2, "c" => 3); 
my @testKeys = ("a", "b", "c"); 

my @testValues = @testHash{@testKeys}; 

Ora supponiamo che ho un riferimento ad hash,

my $hashRef = {"a" => 1, "b" => 2, "c" => 3}; 

Ho provato due modi seguenti:

my @values = @{$hashRef->{@testKeys}}; 
my @values = $hashRef->{@testKeys}; 

Ma nessuno è corretto. C'è un modo corretto, o devo semplicemente dereferenziare l'hash ref ogni volta che voglio farlo?

risposta

21

Sei vicino:

my @values = @$hashref{@testKeys};  ## (1) 

o

my @values = @{$hashref}{@testKeys}; ## (2) 

Per ulteriori esempi, vedere "Slices" in the perllol documentation.

"Using References" in the perlref documentation fornisce le regole generali.

1. Ovunque ti avevo messo un identificatore (o catena di identificatori) come parte di un nome di variabile o subroutine, è possibile sostituire l'identificatore con una semplice variabile scalare contenente un riferimento del tipo corretto.

Questo spiega perché (1) funziona: è stato sostituito l'identificatore testHash con la semplice scalari $hashRef.

2. Ovunque ti avevo messo un identificatore (o catena di identificatori) come parte di un nome di variabile o subroutine, è possibile sostituire l'identificatore con un blocco che restituisce un riferimento del tipo corretto.

Il frammento (2) sopra è quasi lo stesso ma ha una sintassi un po 'ingombrante. Al posto dell'identificatore testHash, si scrive un blocco che restituisce un riferimento a un hash, , ad esempio, {$hashRef}.

Le parentesi qui racchiudono un bona fide blocco , in modo da poter calcolare e restituire un riferimento, come in

push @{ $cond ? \@a1 : \@a2 }, "some value"; 
+2

In questo caso, '@ $ rifhash {} @testKeys' funziona troppo. Preferivo le parentesi '{}' come più esplicite, ma mi piacerebbe andare verso la variante meno rumorosa ora. – ephemient

+0

@ephemient Grazie per avermi aiutato a migliorare la risposta. –

+0

Ah, credo di essere stato intrappolato dalla mia mancanza di comprensione del fatto che la freccia è solo una comoda abbreviazione. –

Problemi correlati