2011-11-09 16 views
8

En Perl 5, cuando tenemos una matriz con nombre, p. @a, conseguir los elementos del índice $N en adelante es simple con un poco de slicing:¿Cómo obtener todos los elementos del índice N al final de una matriz Perl anónima?

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

¿Hay una manera estándar de hacer lo mismo con una gran variedad en el anonimato, sin tener que suministrar la longitud explícita? Es decir. puede esta:

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

o, más específicamente, esto:

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

puede convertir en algo que no necesita el límite superior del rango a ser explícito? ¿Quizás alguna sintaxis oscura de Perl? Tal vez un poco de cortar en lugar de cortar?

PD: Ya he escrito esto como una función: estoy buscando un enfoque más autónomo.

+0

Si desea cortar una serie anónima de '(0,1,2,3,4,5) 'into' 2 3 4 5', entonces ¿por qué no simplemente escribir '(2,3,4,5)' en primer lugar? –

+0

@Blagovest Buyukliev: Porque el índice inicial en mi caso es variable. Edité mi pregunta para reflejar este requisito. – thkala

+0

¿Qué es una "matriz anónima"? :-) –

Respuesta

17

Puede splice que:

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

¡Ah, esto definitivamente funciona! Había intentado 'empalmar' pero no pude hacerlo exactamente. +1 – thkala

1

pienso de turba splice es la mejor opción, pero en el espíritu de opciones:

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

Esto devuelve el mismo resultado que el ejemplo anterior:

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

Esto devuelve '$ N + 1' elementos, pero desea elementos' $ # {anonymous_array} - $ N'. –

+0

Tienes razón de que estoy equivocado, pero por las razones equivocadas :-) – mwp

1

No necesita dar una matriz ref un nombre si establece i T como el tema:

 
    sub returns_array_ref {[1 .. 5]} 

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

O si se está trabajando con una lista:

 
    sub returns_list {1 .. 5} 

    my @slice = sub {@_[$n .. $#_]}->(returns_list); 
Cuestiones relacionadas