2010-09-15 21 views
27

Ho linee di codice con due array di grandi dimensioni (quindi non posso semplicemente scriverlo in un hash) che voglio connettere con un hash.Come posso assegnare due array a un hash in Perl?

Ad esempio, $array1[0] diventa la chiave e $array2[0] diventa il valore e così via per $array1[150], $array2[150].

Qualche idea su come lo faccio?

risposta

56

Lo si può fare in un solo compito:

my %hash; 
@hash{@array1} = @array2; 

E 'un linguaggio comune. Da perldoc perldata on slices:

Se siete confusi sul motivo per cui si utilizza un '@' lì su una fetta di hash invece di un '%', pensa a come questo. Il tipo di staffa (quadrato o riccio) controlla se si tratta di un array o di un hash . Dall'altra parte , il simbolo iniziale ('$' o '@') nell'array o hash indica se si sta recuperando un valore singolare (uno scalare) o un plurale (un elenco).

Quando vedo uno di questi vedo un immagine mentale di una chiusura lampo ...

+0

Curiosità: non sei l'unico. In Python c'è una funzione integrata per convertire due array paralleli in una singola serie di tuple a due elementi, e si chiama ... zip()! http://docs.python.org/library/functions.html#zip :) –

+8

Perl ha un 'zip' in [List :: MoreUtils] (http://search.cpan.org/dist/List-MoreUtils) . C'è anche [C'è un elegante zip per interlacciare due elenchi in Perl] (http://stackoverflow.com/q/38345/8817). –

14

martin Clayton ha la best answer for your general question, mettere c'è anche un'interessante novità in Perl 5.12. È possibile utilizzare each on an array in modo da poter facilmente iterare attraverso array paralleli. E 'utile quando si desidera per manipolare i valori prima di usarli:

while(my($index, $value) = each @array1) { 
     ...; # maybe do something to $value 
     $hash{ $value } = $array2[$index]; 
     } 
+0

http://news.perlfoundation.org/2010/09/perl-5122-released.html –

2

(. Ho provato a postare questo come un commento alla risposta di Brian, ma non sono riuscito a ottenere la giusta formattazione)

Devi fare attenzione a evitare gli usi annidati di each. each funziona su un iteratore "globale" sull'array. Quando raggiunge la fine, restituisce false e quindi reimposta la posizione all'inizio. In questo modo il codice seguente produce un ciclo infinito.

Grazie a RJBS per il suo talk at YAPC::NA in cui ha sottolineato la natura globale dell'iteratore integrato.

use strict; 
use warnings; 

my @array = 'A' .. 'J' ; 

while (my ($index, $value) = each @array){ 
     print "printing ($index, $value) from outer loop\n"; 

     while (my ($index_in, $value_in) = each @array){ 
       print "printing ($index_in, $value_in) from inner loop\n"; 
     } 
} 
+1

Bene, devi evitare tutti i tipi di cose che possono rovinare il tuo programma. Questo è tutto documentato nella voce perlfunc per ciascuno. –

+0

@brian. Non mi sono lamentato della tua risposta, volevo solo aiutare a prevenire bug difficili da spiegare. ;) In retrospettiva, probabilmente ho dato troppe informazioni alla domanda in questione. –

3
use List::MoreUtils qw(zip); 

my @a = 'A' .. 'E'; 

my @b = 1 .. 5; 

my %hash = zip @a, @b; 
Problemi correlati