2011-12-16 40 views
6

在閱讀下載的Perl模塊時,我發現了幾種定義輸入參數的方法,如下所示。他們之間有什麼不同?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; 
} 

回答

4

當一個子程序被調用時,傳遞的參數被放入一個特殊的數組@_。一種能夠消耗該陣列通過偏移值超出my $foo = shift或通過直接數組賦值my ($foo,$bar)[email protected]_;直接從陣列使用的值甚至可以:$_[0]

爲什麼一個與其他人?直接數組分配是最標準和最常見的。有時在有可選結尾值時使用換檔方式。直接數組的用法是不鼓勵的,除非少數小生態位:調用其他函數的包裝函數,尤其是在對象內部。包裝其他功能並修改輸入的函數。也是goto &func的特殊形式,它立即丟棄當前的調用棧並調用當前值@_的func。

# 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和#3是associating an object with a class(面向對象的Perl)的例子。

在#2中,@_是傳遞給函數的參數列表,所以$self$lab1將獲得前2個傳遞參數的值。

在#4中,shift()是一個內置的Perl子例程,它將一個數組作爲參數,然後返回並刪除該數組中的第一個項目。如果它沒有參數,它將在@_上隱含執行。所以$self獲取第一個傳遞參數的值。

相關問題