2011-12-16 15 views
6

Mientras leía un módulo Perl descargado, encontré varias formas de definir los parámetros de entrada, que se enumeran a continuación. Cuáles son las diferencias entre ellos?¿Cuáles son las diferencias entre los mecanismos de entrada de parámetros en Perl?

sub new{ 
    my $class = shift; 
    my $self = {@_}; 
    bless{$self, $class}; 
} 

sub count1{ 
    my ($self, $lab1) = @_; 
} 

sub new1{ 
    my ($class, $lab1) = @_; 
    my $self = {}; 
    bless $class, $self; 
} 

sub setpath{ 
    my $self = shift; 
} 

Respuesta

4

Cuando se invoca una subrutina, los parámetros pasados ​​se ponen en una matriz especial @_. Uno puede consumir esta matriz por valores cambiantes cabo my $foo = shift o mediante la asignación de matrices directa my ($foo,$bar)[email protected]_; Incluso es posible utilizar los valores directamente de la matriz: $_[0]

Por qué uno contra los otros? La asignación de matriz directa es la más estándar y común. A veces, la forma de desplazamiento se usa cuando hay valores finales opcionales. Se desaconseja el uso directo de matriz, excepto en algunos nichos pequeños: las funciones de envoltura que llaman a otras funciones, especialmente al interior de los objetos. funciones que envuelven otras funciones y modifican las entradas. También la forma especial de goto &func que inmediatamente deja caer la pila de llamadas actual y llama a func en el valor actual de @_.

# use shift for optional trailing values 
use v5.10; 
my $foo = shift; 
my $bar = shift // 'default bar value'; 
my $baz = shift // 'default baz value'; 

#obj method to call related non-object function. 
sub bar { my $self = shift; _bar(@_) } 
sub longname { shortname(@_) } 
sub get { return $_[0]->$_[1]; } 
4

# 1 y # 3 son ejemplos de associating an object with a class (Object Oriented Perl).

En # 2, @_ es la lista de los parámetros pasados ​​a la función, por lo $self y $lab1 obtener los valores de los 2 primeros parámetros pasados.

En el n. ° 4, shift() está una subrutina Perl incorporada que toma una matriz como argumento, luego devuelve y elimina el primer elemento de esa matriz. Si no tiene ningún argumento, se ejecuta implícitamente en @_. Entonces $self obtiene el valor del primer parámetro pasado.

Cuestiones relacionadas