6

ダウンロードした 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

2 に答える 2

4

サブルーチンが呼び出されると、渡されたパラメーターが特別な配列に入れられます@_。値をシフトアウトするmy $foo = shiftか、配列を直接代入することで、この配列my ($foo,$bar)=@_; を使用できます。配列から直接値を使用することもできます。$_[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]; }
于 2011-12-16T22:12:52.023 に答える
4

#1 と #3 は、オブジェクトをクラスに関連付ける例です(Object Oriented Perl)。

#2では@_、関数に渡されるパラメーターのリストであるため、最初に渡された2つのパラメーターの値$self$lab1取得します。

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

于 2011-12-16T21:11:51.800 に答える