2011-11-09 13 views
8

W Perlu 5, gdy mamy tablicę nazw, np. @a, coraz elementy począwszy od indeksu $N jest prosta z odrobiną slicing:Jak zdobyć wszystkie elementy z indeksu N na koniec z anonimowej tablicy Perla?

my @result = @a[$N..$#a]; 

Czy istnieje standardowy sposób, aby zrobić to samo z anonimowej tablicy, bez konieczności dostarczania długość jawnie? To znaczy. Może to:

my @result = (0,1,2,3,4,5)[2..5]; 

lub, bardziej szczegółowo, to:

my @result = (0,1,2,3,4,5)[$N..5]; 

być przekształcony w coś, co nie wymaga górnej granicy zakresu być jawne? Być może jakieś niejasne składnie Perla? Może trochę kostki zamiast krojenia?

PS: Pisałem już to jako funkcję - szukam bardziej niezależnego podejścia.

+0

Jeśli chcesz pokroić anonimowy tablicę '(0,1,2,3,4,5) 'na' 2 3 4 5', to dlaczego nie po prostu napisać '(2,3,4,5)' w pierwszej kolejności? –

+0

@Blagovest Buyukliev: Ponieważ indeks początkowy w moim przypadku jest zmienny. Zmieniłem moje pytanie, aby odzwierciedlić ten wymóg. – thkala

+0

Co to jest "anonimowa tablica"? :-) –

Odpowiedz

17

Można go splice:

@result = splice @{[0..$M]}, $N; # return $N .. $M 
+0

Ah, to zdecydowanie działa! Próbowałem "splice", ale nie mogłem zrobić tego dokładnie. +1 – thkala

1

myślę mob na splice jest najlepszym rozwiązaniem, ale w duchu opcji:

my @result = reverse ((reverse 0..5)[0..$N+1]); 

ta zwraca taki sam wynik jak w powyższym przykładzie:

my @result = (0..5)[$N..5]; 
+0

Powoduje zwrócenie elementów '$ N + 1', ale potrzebujesz elementów' $ # {anonymous_array} - $ N'. –

+0

Masz rację, że się mylę, ale z niewłaściwych powodów :-) – mwp

1

Nie musisz podawać tabliczki, aby zmienić nazwę, jeśli ustawisz t jak w temacie:

 
    sub returns_array_ref {[1 .. 5]} 

    my @slice = map @$_[$n .. $#$_] => returns_array_ref; 

Lub jeśli pracujesz z listy:

 
    sub returns_list {1 .. 5} 

    my @slice = sub {@_[$n .. $#_]}->(returns_list); 
Powiązane problemy