web-dev-qa-db-ja.com

Perlでの@_の意味は何ですか?

Perlの@_の意味は何ですか?

82
Andrei

perldoc perlvar は、特別な名前のPerl変数情報をチェックする最初の場所です。

引用:

@_:サブルーチン内の配列@_には、そのサブルーチンに渡されるパラメーターが含まれます。

詳細は perldoc perlsub(Perlサブルーチン) perlvarからリンクされています:

渡された引数は、配列@_に表示されます。

したがって、2つの引数で関数を呼び出した場合、それらは$_[0]および$_[1]に保存されます。

配列@_ローカル配列ですが、その要素は実際のスカラーパラメータのエイリアスです。特に、要素$ _ [0]が更新されると、対応する引数が更新されます(更新可能でない場合はエラーが発生します)。

引数が、関数が呼び出されたときに存在しなかった配列またはハッシュ要素である場合、その要素は、変更された場合(および参照された場合)にのみ作成されます。 (以前のバージョンのPerlの一部は、要素が割り当てられているかどうかに関係なく要素を作成しました。)配列全体に割り当てる@_は、そのエイリアスを削除し、引数を更新しません。

112
DVK

通常、@_変数を使用して、subに渡されるパラメーターを展開します。

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

perlcritic で正しいと主張されている方法です。

25
eckes

問題は、Perlでは@_meansでした。その質問に対する答えは、$_がPerlでitを意味する限り、@_は同様にtheyを意味するということです。

itsの意味の重要な側面と、theirs

したがって、これらは両方とも代名詞として使用されることもありますが、時には話題化者として使用されることもあります。

常にではありませんが、通常、それらにはわずかな前件があります。

10
tchrist

Perl @_の検索 の最初のヒットは this と言います:

@_は、サブルーチンへの着信パラメーターのリストです。

また、同じことについてより長くより詳細な説明があります。

9
Piskvor

Perlのすべての「特殊変数」は、 perlvar ドキュメントページにリストされています。

5
aschepler

ほとんどの場合、個々の変数にシフトを使用することもできます。

$var1 = shift;

Perlには、サブルーチン内の外部情報にアクセスする興味深い方法が数多くあるため、これはさらに調査する必要があるトピックです。

5
hockfan86

また、関数が配列を返したが、その関数が、返されたデータを以下のような変数に割り当てずに呼び出された場合も同様です。ここではsplit()が呼び出されますが、どの変数にも割り当てられていません。返されたデータには、後で@_からアクセスできます。

$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

これにより、文字列$strが分割され、配列@_が設定されます。

2
Afser2000

@は配列に使用されます。

サブルーチンで、またはPerlで関数を呼び出すときに、パラメーターリストを渡すことができます。その場合、@_を使用して、パラメーターリストを関数に渡すことができます。

sub Average{

    # Get total number of arguments passed.
    $n = scalar(@_);
    $sum = 0;

    foreach $item (@_){

        # foreach is like for loop... It will access every
        # array element by an iterator
        $sum += $item;
    }

    $average = $sum / $n;

    print "Average for the given numbers: $average\n";
}

関数呼び出し

Average(10, 20, 30);

上記のコードを確認する場合は、foreach $item(@_)行を参照してください...ここでは、入力パラメーターを渡します。

1

@_変数を編集しようとしないでください!!!!それらに触れてはいけません。または、疑いのない効果が得られます。例えば...

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

呼び出し前にsub1 $ sizeには1234が含まれますが、500(!!)の後はこの値を編集しないでください!!! 2つ以上の値を渡してサブルーチンで変更すると、すべてが変更されます!この効果が説明されているのを見たことがありません。私が見たプログラムも@_配列を読み取り専用のままにします。そして、あなたが安全に変数を渡すことができるということだけが内部サブルーチンを変更しないでくださいあなたは常にそれをしなければなりません:

sub sub2{
  my @m=@_;
  ....
}

@_をローカルサブルーチンプロシージャ変数に割り当て、次にそれらを操作しました。また、配列を返すいくつかの深再帰アルゴリズムでは、このアプローチを使用してローカル変数に使用されるメモリを削減できます。同じ配列@_を返す場合のみ。

0
Anatoly