2010-01-18 13 views
6

Tengo una lista que contiene argumentos que quiero pasar a una función. ¿Cómo llamo a esa función?¿Cómo puedo pasar los elementos en una referencia de matriz Perl como argumentos separados a una subrutina?

Por ejemplo, imagina que tenía esta función:

sub foo { 
    my ($arg0, $arg1, $arg2) = @_; 
    print "$arg0 $arg1 $arg2\n"; 
} 

Y digamos que tengo:

my $args = [ "la", "di", "da" ]; 

Como llamar en foo sin escribir foo($$args[0], $$args[1], $$args[2])?

+2

¿De dónde viene el 'APLICAR'? ¿Es esto una construcción en otro idioma? – daotoad

+3

ENVIAR viene de LISP http://nostoc.stanford.edu/jeff/llisp/21.html –

+1

@daotoad Viene de Lisp pero la mayoría de los idiomas tienen su forma equivalente. Es una de esas cosas que es muy difícil para Google, ya que varios idiomas componen una terminología diferente para la misma cosa. –

Respuesta

9

Esto debe hacerlo:

foo(@$args) 

Eso no es en realidad una función apply. Esa sintaxis simplemente elimina la referencia de una matriz de regreso a la matriz simple. man perlref le dice más acerca de las referencias.

+0

También podría considerar no construir la referencia para comenzar, es decir, '@args = (" la "," de "," dah ")' o incluso '@args = qw (la de dah);' y luego pasarla con 'foo (@args)'. Esto es más claro y más directo que hacer el baile de referencia, aunque si tienes otras limitaciones (por ejemplo, la matriz ya es parte de una estructura de datos) no es un gran problema. – fennec

6

Prueba esto:

foo(@$args); 
10

Desreferencia una referencia de matriz pegando @ delante de ella.

foo(@$args); 

O si quieres ser más explícito:

foo(@{ $args }); 
4
foo(@$args); 

O, si usted tiene una referencia a foo:

my $func = \&foo; 
... 
$func->(@$args); 
2

Es muy sencillo. foo (@ {$ args})

Cuestiones relacionadas