2009-10-06 12 views
5

Mam tablicę HTML::Element s uzyskaną z HTML::TreeBuilder i HTML::Element->find i muszę przypisać ich wartość as_text do innych zmiennych. Wiem, że można naprawdę łatwo zrobićTworzenie tablicy z funkcji obiektu przy użyciu mapy

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

ale miałem nadzieję mogłem użyć map zamiast tylko do kodu nieco bardziej czytelny, ponieważ istnieją co najmniej 8 elementów w tablicy. Jestem naprawdę nowy w Perlu, więc nie jestem całkiem pewien, co robić.

Czy ktoś może wskazać mi właściwy kierunek?

Odpowiedz

9

Jeśli dobrze zorientowani w perldoc -f map to całkiem jasne:

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

Działa także jeśli chcesz przypisać do listy skalarów:

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

Ale oczywiście wersja tablicy jest lepszy dla nieznanej liczby elementów.

+2

To Jest to poważny problem osobistych preferencji, ale wolę użyć formy WYRAŻA 'map', gdy transformacja jest wystarczająco prosta:' map $ _-> as_text, @ arr'. – hobbs

+1

@Hobbs - często robię, ale nie byłem pewien, czy $ _-> as_text działałoby zgodnie z oczekiwaniami. Wiem, że działa 'map chr, @ arr', ale nie wiedziałem, czy wywołanie metod może działać tak samo. Przypuszczam, że jedynym sposobem, aby się tego dowiedzieć, jest przetestowanie go, ale w tym konkretnym przypadku osobiście wolę używać nawiasów. –

+1

@hobbs 'map WYŚLIJ, LISTA jest również szybszy niż' mapLOCK LIST' ale jestem frajerem dla tego ostatniego. –

1

zauważyć, że jeśli po prostu chcesz mapować dwa pierwsze elementy @arr:

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

wywoła $_->as_text dla wszystkich elementów @arr. W tym przypadku, należy plasterek tablicy w celu uniknięcia niepotrzebnych połączenia:

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

przykład:

#!/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"; 

wyjściowa:

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

ord nazwano dla każdego elementu @arr natomiast uc nazwano tylko dla elementów, które nas interesowały.

Powiązane problemy