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


68

Perlの@_の意味はなんですか? search for perl @_

97

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

引用:

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

配列@_にショーアップに渡される任意の引数:

詳細はperlvarをからリンクされているperldoc perlsub (Perl subroutines)で見つけることができます。

したがって、引数が2つの関数を呼び出した場合、 は$_[0]$_[1]に格納されます。

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

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

  0

ありがとう、私は最近、perldocのチェックに慣れてきました。そして、私はウェブページが有用であることを発見しました:http://perldoc.perl.org/perlvar.htmlこれを起動するperlスタブを作ることは悪くないウェブ...ウェブページのフォーマットは私を大きく助けます。 04 12月. 162016-12-04 07:21:06


8

最初のヒットはthis言う:

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

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

  0

実際には、Google検索の最初のヒットがこのページにリンクしています。 14 8月. 172017-08-14 22:14:55

  0

... 7年後*、インターネット時代の永遠。だから、私は最初の結果にリンクし、関連する部分をqoutedした:Google単独では非常に素朴なだろう。 14 8月. 172017-08-14 22:16:58

  0

それは何年も後のことですが、質問に対する答えをGoogleに知らせることを意味する答えを読むのはまだ迷惑です。グーグルの結果として答えを読んでいる人にとっては無意味な情報です。 14 8月. 172017-08-14 22:21:53

  0

私は同意しません。 「質問をする前に*あなたの問題を検索してください。」はまだステップ0です。https://stackoverflow.com/help/how-to-askおそらく、*あなた*に迷惑をかけていますが、最初にマシンに問い合わせることで答えられる可能性があります。 14 8月. 172017-08-14 22:32:43

  0

はい検索が正しい最初の手順ですが、回答を検索するための手順を含める必要はありません。それは価値のない冗長な情報です。誰かがあなたの答えの中で検索リンクをたどると、どこから始めたのか分かりません。 14 8月. 172017-08-14 22:49:12

  0

冗長性を持って生きることを学び、次に世界は冗長で冗長です。また、あなたは1.編集と2.wrongを自由に提案することができます。正しい答えとその出典が*含まれているため、それらを戻すことはありません。 14 8月. 172017-08-14 22:52:31

  0

そして、btw、はい、SOは冗長性を減らすことになっていました。それがどれくらいうまくいくか見てみましょうか?なぜだろう? **ユーザーはUTFGにまず迷惑をかけたり、すでに同じ質問があるかどうかをチェックしたりすることはできません** - 私たちが主張している同じGoogle検索では、 。冗長な冗長性。 14 8月. 172017-08-14 22:55:45


5

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


20

通常、あなたは@_変数使用サブに渡されたパラメータを展開します

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

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

方法はperlcriticで正しいことを主張します。

  0

これは私が 'perlcritic'に反対する一回ですが、個人的にはこれは関数には最適だと思っていますが、メソッドに対しては'参照 'をシフトして '@ _'配列を​​展開すると便利です。これはこれがメソッドであり、メソッドが特定のパラメータを取ることを明確にしています。 09 5月. 112011-05-09 14:25:19

  0

以前はPERLCriticについて知っていたはずですが、私はそうしませんでした。この例で使っていただきありがとうございます。あなたが参考にしているものは、まったく新しいものを学ぶのに役立ちます。 04 12月. 162016-12-04 07:22:33


5

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

$var1 = shift; 

これはPerlがあなたのサブ・ルーチン内で外部の情報にアクセスするのは興味深いいくつかの方法を持っているとして、あなたはさらなる研究べき話題です。

+3

クール、誰でも私に似たようなことをするための別の方法を投稿するだけで投票を下しました。誰かがすでに行っているので、私は直接質問に答えなかったことに気がつきましたが、私は、新しいパールプログラマーがしばしば混乱してしまう代替形式を提案しました。 14 2月. 112011-02-14 02:59:56


7

質問は何でしたか@_は、Perlでを意味します。その質問に対する答えは、$_は、を意味し、それはのPerlで、@_を同様に意味します。を意味します。

意味のこの重要な側面については誰も言及していません。の意味はです。

これらは結果として代名詞として使用されるか、時にはトピカルライザーとして使用されます。

通常、必ずしもそうではありませんが、通常は名詞的前例があります。


1

また、関数が配列を返しても、その関数は、返されたデータを以下のような変数に代入することなく呼び出されます。 split()は呼び出されますが、変数には割り当てられません。私たちは@_を通じて、後でその返されたデータにアクセスすることができます。

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

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

これは、文字列$strを分割し、配列@_を設定します。


1

@がアレイに使用されます。

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

  0

常に 'use strict'を使うべきです。私はあなたのサブ機能を編集しました。 23 7月. 142014-07-23 15:49:27


0

@ variable_!に編集しないでください!彼らは触られてはいけません..あなたは何の疑いもない効果を得ます。たとえば...

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

コールSUB1の$のサイズが1234が含まれている。しかし500(!!)ですから、この値を編集しないでください後にする前に! 2つ以上の値を渡してサブルーチンで変更すると、すべてが変更されます。私は決してこの効果を説明していない。私が見たプログラムも@_配列を読み込み専用のままにしておきます。次

sub sub2{ 
    my @[email protected]_; 
    .... 
} 

ローカルサブルーチンプロシージャ変数に割り当て@_とは彼らと働いた:そして、唯一のあなたが安全に変数を渡すことをあなたは常にそれを行う必要がある内部サブルーチン を変更しないでください。 また、配列をreturunするいくつかの深い再帰アルゴリズムでは、この方法を使用してローカル変数に使用されるメモリを減らすことができます。 @ _配列を返す場合にのみ同じ。