2010-07-01 8 views
16

Esta pregunta se ha realizado sobre PHP here y here, y tengo la misma pregunta para Perl. Dada una función que devuelve una lista, ¿hay alguna manera (o cuál es la mejor) de indexar inmediatamente sin usar una variable temporal?Indexación directamente en la matriz devuelta en Perl

Por ejemplo:

my $comma_separated = "a,b,c"; 
my $a = split (/,/, $comma_separated)[0]; #not valid syntax 

veo la razón por la sintaxis en la segunda línea no es válida, por lo que estoy preguntando si hay una manera de conseguir el mismo efecto sin asignar primero el valor de retorno a una lista y indexación de eso.

Respuesta

25

sólo tiene que utilizar paréntesis para definir su lista y luego en un índice para tirar de su elemento deseado (s):

my $a = (split /,/, $comma_separated)[0]; 
+0

Eso fue simple --- gracias. – Carl

+7

Dado que en muchos casos los paréntesis son opcionales en función cals, normalmente escribiría esto como 'mi $ x = (división /,/=> $ str) [0]' –

+0

@Carl, una forma en que podría pensar que es que para 'split (...)' los paréntesis solo direccionan la * llamada * -> a la que desea llamar dividir con estos argumentos. Alterar un '[0]' en eso tiene poco sentido. Sin embargo, '(división ...)' trata el valor * devuelto *, que es realmente lo que quiere indexar. – Axeman

8

Al igual que usted puede hacer esto:

($a, $b, $c) = @array; 

Usted puede hacer esto:

my($a) = split /,/, $comma_separated; 

my $a en el LHS (lado izquierdo) se trata como contexto escalar. my($a) es contexto de la lista. Es una lista de elementos individuales por lo que solo obtiene el primer elemento devuelto por split.

Tiene el beneficio adicional de limitar automáticamente la división, por lo que no hay trabajo perdido si $comma_separated es grande.

+4

Perl ya realiza esta optimización automáticamente. Desde "perldoc -f split": "Al asignar a una lista, si se omite LIMIT o cero, Perl proporciona un LIMIT uno más grande que el número de variables en la lista, para evitar trabajo innecesario". – Sean

+0

¡Oh limpio, no tenía ni idea! Parece que siempre ha hecho eso. – Schwern

Cuestiones relacionadas