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


回答:


118

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

引用:

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

詳細については、perlvarからリンクされているperldoc perlsub(Perlサブルーチン)を参照してください。

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

したがって、2つの引数を持つ関数を呼び出すと、それらは$_[0]およびに格納され$_[1]ます。

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

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


おかげで、私はごく最近のperldocをチェックするに自分自身を慣れてきた、と私は便利なWebページを見つけた:perldoc.perl.org/perlvar.html perlのスタブを作るために悪くはなかったというウェブ上の起動この...ウェブページのフォーマットは私にとても役立ちます。
aschultz 16

27

通常、変数を使用してサブルーチンに渡されるパラメーターを展開します@_

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

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

これがperlcriticによって正しいと主張されている方法です


2
これは私が同意しない1回ですがperlcritic、個人的には、これは関数に最適であると思いますが、メソッドの場合はshift、自己参照して@_配列をアンパックするのに役立ちます。これにより、これがメソッドであり、メソッドが特定のパラメーターをとることが明らかになります
Joel Berger

私はおそらく以前にPERLCriticについて使用/知っているべきでしたが、そうではありませんでした。この例で使用していただきありがとうございます。オフハンドで参照するものは、誰かがまったく新しいことを学ぶのに役立つことがあります。
aschultz 16

10

検索のperl @_最初のヒットはこれ言います

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

また、より長く、より詳細な説明があります。


3
実際、Google検索の最初のヒットはこのページにリンクしています。
ガブリエルサザン

... 7 後、インターネットの時代は永遠に。これが私が最初の結果にリンクし、関連する部分を引用した理由です。Googleだけに依存するのは非常に単純です。
Piskvorが

1
確かにそれは何年も後のことですが、質問への回答をグーグルで調べなければならないことを意味する回答を読むのはまだ面倒です。グーグルの結果として誰かが答えを読んだとしても、それは無意味な情報です。
ガブリエルサザン

同意しません。「あなたの問題を検索する前に、まだ0のステップで質問をする」stackoverflow.com/help/how-to-askに迷惑なあなた多分、 -しかし、その繰り返しの質問の束である可能性が最初のマシンを照会することによって回答されているが。
Piskvorが

2
はい、検索は正しい最初のステップですが、回答に検索するための指示を含める必要はありません。価値のない冗長な情報であり、皮肉なのは、誰かがあなたの回答の検索リンクをたどると、彼らが彼らを始めたところに連れ戻すからです。
ガブリエルサザン

10

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

誰もその意味のこの重要な側面に言及しているようには見えません- 彼らの意味も同様です。

結果として、それらは両方とも代名詞として、または時にはトピック化要素として使用されます。

常にではないが、彼らは通常、名目前件を持っています。


7

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

$var1 = shift;

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


3
クール、似たようなことをする別の方法を投稿するためだけに私に反対票を投じた人。私は誰かがすでに回答したために質問に直接回答しなかったことがわかりましたが、新しいperlプログラマーがしばしば混乱する代替形式を提供しました。
hockfan86


2

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

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

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

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


1

@ 配列に使用されます。

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

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(@_)行を参照してください...ここでは、入力パラメーターを渡します。


常にすべきuse strictです。したがって、私はあなたのサブ機能を編集しました。
EverythingRightPlace 14

0

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

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.