2012-03-21 14 views
11

Say podprogram Perl zwraca tablicę:W jaki sposób mogę uzyskać dostęp do elementów zwracanych przez podprogram Perl?

sub arrayoutput 
{ 
    ...some code... 
    return @somearray; 
} 

Chcę dostęp tylko konkretny element tablicy z tym powiedzieć, że w pierwszej kolejności. Mogłem więc:

@temparray=arrayoutput(argument); 

, a następnie odsyłać do $temparray[0].

Jednak ten krótki opis nie działa: $arrayoutput(some argument)[0].

Jestem przyzwyczajony do Pythona i nowego w Perlu, więc nadal szukam krótkiego, intuicyjnego, podobnego do Pythona sposobu (a=arrayoutput(some argument)[0]), aby uzyskać tę wartość. Moje programy w Perl robią się bardzo długie i używanie tymczasowych tablic, jak to wydaje się brzydkie. Czy jest jakiś sposób, żeby to zrobić w Perlu?

Odpowiedz

10

Slices

use warnings; 
use strict; 

sub foo { 
    return 'a' .. 'z' 
} 

my $y = (foo())[3]; 
print "$y\n"; 

__END__ 

d 

UPDATE: Kolejny przykład kodu zająć komentarz. Nie trzeba zmienną pośrednią:

use warnings; 
use strict; 

sub foo { 
    return 'a' .. 'z' 
} 

print((foo())[7], "\n"); 

if ((foo())[7] eq 'h') { 
    print "I got an h\n"; 
} 

__END__ 

h 
I got an h 
+0

+1, to działa. Ale znowu muszę utworzyć pośrednią zmienną, aby uzyskać dostęp do wartości. Ale jest to o jeden krok lepszy, ponieważ mogę go przynajmniej użyć, kiedy i tak potrzebuję zmiennej przypisania. Ale nie w innych scenariuszach, powiedzmy 'print (foo()) [3]' statement lub 'if ((foo()) [3] ...)'. –

+0

Możesz zrobić obie te rzeczy. Zobacz moją zaktualizowaną odpowiedź. – toolic

+2

Zauważ, że 'print (foo()) [7]' nie działa zgodnie z oczekiwaniami, ponieważ perl zakłada, że ​​nawiasy należą do wywołania funkcji, i w ten sposób analizuje je jako równoważne '(print foo()) [7] '. Albo 'print ((foo()) [7])' lub, bardziej idiomatycznie, 'print + (foo()) [7]' będzie działać. –

2

Jednym ze sposobów może być [(arrayoutput(some argument))]->[0].

+0

+1, to działa! Nie rozumiem, dlaczego jest to odrzucane. Czy jest tu jakaś zła praktyka programowania lub coś innego, co tu się dzieje, czego mi brakuje? –

+1

Nie ma potrzeby używania odniesienia do tablicy. Sądzę, że to jest powód upadku. –

14

Zdjąć pierwszy argument tylko poprzez kontekście listy:

my ($wanted) = array_returning_sub(@args); 

TIMTOWTDI z plasterkiem:

my $wanted = (array_returning_sub(@args))[0]; 

Oba style mogła być rozszerzony, aby wyodrębnić n-ty element zwróconej tablicy, chociaż wycinek listy jest nieco łatwiejszy w odbiorze:

my (undef, undef, $wanted, undef, $needed) = array_returning_sub(@args); 

my ($wanted, $needed) = (array_returning_sub(@args))[2,4]; 
+0

Odczytana jako '" zwracająca tablicę podrzędna "', nie '" tablica zwracająca [a] pod "' – Zaid

+1

Z wyjątkiem podsieci nie może zwrócić tablic. Mogą tylko zwrócić listy skalarów. – ikegami

+0

+1. Więc to była tylko kwestia nawiasów! Wycinek listy jest również lepszy w kontekście listy dla długich list. –

Powiązane problemy