2011-12-16 9 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]

1つの値と他の値はどうしてですか?直接配列割り当てが最も標準的で一般的です。オプションの末尾の値がある場合は、時々シフト方法が使用されます。ダイレクトアレイの使用は、いくつかの小さなニッチを除いてはお勧めできません。他の関数、特にオブジェクトの内部を呼び出すラッパー関数です。他の関数をラップし、入力を変更する関数。 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つのパラメータの値を取得します。

#12では、shift()はPerlサブルーチンで、配列を引数として受け取り、その配列の最初の項目を返して削除します。引数がない場合、暗黙的に@_に実行されます。したがって、$selfは最初に渡されたパラメータの値を取得します。

関連する問題