2011-12-16 6 views
6

Durante la lettura di un modulo Perl scaricato, ho trovato diversi modi di definire parametri di input, che sono elencati come segue. Quali sono le differenze tra loro?Quali sono le differenze tra i meccanismi di inserimento dei parametri in 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; 
} 

risposta

4

Quando una subroutine viene chiamata, i parametri passati sono messi in una matrice speciale @_. Si può consumare questo fila per valori spostando fuori my $foo = shift o alla cessione di matrice diretta my ($foo,$bar)[email protected]_; È anche possibile usare i valori direttamente dalla matrice: $_[0]

Perché uno contro gli altri? L'assegnazione diretta dell'array è la più comune e standard. A volte il modo shift è usato quando ci sono valori finali finali. L'utilizzo diretto dell'array è sconsigliato tranne in alcune piccole nicchie: funzioni wrapper che chiamano altre funzioni, specialmente all'interno degli oggetti. funzioni che avvolgono altre funzioni e modificano gli input. Inoltre la particolare forma di goto &func che scende immediatamente la pila chiamata corrente e chiede Funz al valore corrente di @_.

# 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 e # 3 sono esempi di associating an object with a class (Object Oriented Perl).

In # 2, @_ è la lista di parametri passati alla funzione, in modo da $self e $lab1 ottenere i valori dei primi 2 parametri passati.

In # 4, shift() è una subroutine integrata in Perl che accetta un array come argomento, quindi restituisce ed elimina il primo elemento in quell'array. Se non ha argomenti, viene eseguito implicitamente su @_. Quindi $self ottiene il valore del primo parametro passato.