2011-04-19 19 views
12

En C++ me gustaría hacer algo como esto:¿Cómo se accede a los parámetros de función en Perl?

void some_func(const char *str, ...); 
some_func("hi %s u r %d", "n00b", 420); 

En PHP lo haría así:

function some_func() 
{ 
    $args = func_get_args(); 
} 
some_func($holy, $moly, $guacomole); 

¿Cómo puedo hacer que en Perl?

sub wut { 
    # What goes here? 
} 

Respuesta

24

Harías:

sub wut { 
    my @args = @_; 
    ... 
} 

Perl rellena automáticamente el @_ variable especial cuando se llama a una función. Se puede acceder a él de varias maneras:

  • directamente, por el simple uso @_ o elementos individuales dentro de ella como $_[0], $_[1], y así sucesivamente
  • asignándole a otra matriz, como se muestra arriba
  • mediante la asignación a una lista de escalares (o, posiblemente, un hash, o otra matriz, o combinaciones de los mismos):

    sub wut { 
        my ($arg1, $arg2, $arg3, @others) = @_; 
        ... 
    }

Tenga en cuenta que en este formulario debe colocar la matriz @others al final, ya que si la ingresó antes, absorberá todos los elementos de @_. En otras palabras, esto no funcionará:

sub wut { 
    my ($arg1, @others, $arg2) = @_; 
    ... 
} 

También puede utilizar shift para tirar de los valores fuera de @_:

sub wut { 
    my $arg1 = shift; 
    my $arg2 = shift; 
    my @others = @_; 
    ... 
} 

Tenga en cuenta que shift funcionará automáticamente en @_ si no se proporciona con una discusión

Editar: También puede usar argumentos con nombre usando una referencia hash o hash. Por ejemplo, si se llama a wut() como:

wut($arg1, { option1 => 'hello', option2 => 'goodbye' }); 

... A continuación, podría hacer algo como:

sub wut { 
    my $arg1 = shift; 
    my $opts = shift; 
    my $option1 = $opts->{option1} || "default"; 
    my $option2 = $opts->{option2} || "default2"; 
    ... 
} 

Esta sería una buena manera de introducir parámetros con nombre en sus funciones, por lo que se puede agregar parámetros más tarde y no tiene que preocuparse por el orden en que se pasan.

+3

Si tiene * muchas, muchas * args, puede evitar copiarlas: 'sub wut {for my $ arg (@_) {blah blah blah}}'. Tenga cuidado con esto, sin embargo, porque cada elemento en '@ _' es un alias del argumento original y puede ** cambiar sus variables de llamada **. – daotoad

+0

Puede aceptar una respuesta en 11 minutos – JOSHUA

+1

También puede mencionar hacer parámetros nombrados a través de 'my% args = @_;' – friedo

Cuestiones relacionadas