2009-10-06 1 views
5

Ho una matrice di HTML::Element s ottenuta da HTML::TreeBuilder e HTML::Element->find e devo assegnare il loro valore as_text ad alcune altre variabili. So che posso davvero fare facilmenteCreazione di una matrice dalla funzione oggetto utilizzando la mappa

my ($var1, $var2) = ($arr[0]->as_text, $arr[1]->as_text); 

ma speravo che potrei usare map invece solo per rendere il codice un po 'più leggibile in quanto vi sono almeno 8 elementi dell'array. Sono davvero nuovo di Perl quindi non sono abbastanza sicuro di cosa fare.

Qualcuno può indicarmi la giusta direzione?

risposta

9

Se sei esperto in perldoc -f map è abbastanza chiaro:

my @as_texts = map { $_->as_text } @arr; 

funziona bene se si desidera assegnare a un elenco di scalari:

my($var1, $var2, $var3, ...) = map { $_->as_text } @arr; 

Ma naturalmente la versione matrice è meglio per un numero sconosciuto di elementi.

+2

Questo io È un grosso problema di preferenze personali, ma preferisco usare la forma EXPR di 'map' quando la trasformazione è abbastanza semplice:' map $ _-> as_text, @ arr'. – hobbs

+1

@hobbs: lo faccio spesso, ma non ero sicuro che $ _-> as_text funzionasse come previsto in quel caso. So che 'map chr, @ arr' funziona, ma non sapevo se le chiamate al metodo potevano essere fatte per funzionare allo stesso modo. Suppongo che l'unico modo per scoprirlo è testarlo, ma in questo caso specifico preferisco usare le parentesi. –

+1

@hobbs 'map EXPR, LIST' è anche più veloce di' map BLOCK LIST', ma io sono un sucker per quest'ultimo. –

1

Si noti che, se si desidera solo per mappare i primi due elementi della @arr:

my($var1, $var2) = map { $_->as_text } @arr; 

invocherà $_->as_text per tutti gli elementi di @arr. In tal caso, utilizzare una fetta matrice per evitare inutili chiamate:

my($var1, $var2) = map { $_->as_text } @arr[0 .. 1]; 

Esempio:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @arr = 'a' .. 'z'; 
my $count; 
my ($x, $y) = map { $count++; ord } @arr; 

print "$x\t$y\t$count\n"; 

$count = 0; 
($x, $y) = map { $count++; uc } @arr[0 .. 1]; 

print "$x\t$y\t$count\n"; 

uscita:

 
C:\Temp> jk 
97  98  26 
A  B  2 

ord è stato chiamato per ogni elemento di @arr che uc stato chiamato solo per gli elementi che ci interessavano.