4

Perl の学習を始めたばかりで、この演習 (Perl の学習の第 4 章から) に戸惑っています。

greet() サブルーチンの開始時に、引数 $_ を $name (my $name = $_) 変数に割り当てようとしていますが、うまくいきません。この本には、「私の名前 = shift;」を使用するように書かれています。しかし、理由がわかりません。shift は配列から値を削除するために使用され、私の引数は私が知る限り配列ではなく、スカラー内の文字列です!

私が理解していないことを誰か説明できますか?

ありがとう!これがコード全体です。

use 5.012;
use warnings;
use utf8;

sub greet {
   my $name = $_;
   state $last_person ;
   if (defined $last_person ) {
          print "Hi $name! $last_person is also here!\n";

   } else {
          print "Hi $name! You are the first one here!\n";
   }
   $last_person = $name;
}

greet( 'Fred' );
greet( 'Barney' );
greet( 'Wilma' );
greet( 'Betty' );
4

3 に答える 3

8

Learning Perl(6th edition)の第4章には、引数と呼ばれるセクションがあります。そこでは次のように述べています。

これは、最初のサブルーチンパラメータがに$_[0]あり、2番目のサブルーチンパラメータがに格納されていることを意味します$_[1]。しかし、-そしてここに重要な注意があります-これらの変数は変数とは何の関係もありません。 $_( 配列$dino[3]の要素)が(完全に別個のスカラー変数)と関係があるだけです。サブルーチンがそれを使用するには、パラメータリストが配列変数に含まれている必要があり、Perlはこの目的でを使用します。@dino$dino@_

Perlの学習、第6版、第4章

したがって、、または$_を使用する必要があるときに、を使用するのはおそらく間違っています。便宜上、サブルーチン内にいるときは、明示的な引数を指定しない場合、デフォルトでシフトオフするため、一般的なイディオムはと言うことです。my $name = $_[0];my $name = shift @_;shift@_my $name = shift;

別のリソースを必要としている人のために、perldoc perlintro@_には、サブルーチンにパラメーターを渡し、またはを介してそれらにアクセスするための優れた(そして適切に簡潔な)説明もありますshift

これがからの簡単なスニペットですperlintro

それは何shiftですか?さて、サブルーチンへの引数は、と呼ばれる特別な配列として利用できます@_(詳細についてはを参照してくださいperlvar)。関数のデフォルトの引数はshiftたまたま@_です。したがってmy $logmessage = shift;、最初の項目を引数のリストからシフトして、に割り当てます$logmessage

于 2012-07-07T21:23:08.523 に答える
4

この章の一部をスキップしたようです。引数(最新の第6版の66ページ)のセクションを読みましたか。それは言う

Perlはリストをサブルーチンに渡します。つまり、Perlは、必要に応じてサブルーチンが使用できるようにリストを作成します。もちろん、このリストはどこかに格納する必要があるため、Perlは、サブルーチンの期間中、パラメータリスト(引数リストの別名)を@_という名前の特別な配列変数に自動的に格納します。この配列にアクセスして、引数の数とそれらの引数の値の両方を判別できます。

これは、最初のサブルーチンパラメータが$ _ [0]にあり、2番目のサブルーチンパラメータが$_[1]に格納されていることを意味します。しかし、ここで重要な注意点として、これらの変数は$ _変数とは何の関係もありません。それ以上は、$ dino [3](@dino配列の要素)が$ dino(完全に別個のスカラー変数)と関係があります。 )。サブルーチンがそれを使用するには、パラメータリストが配列変数に含まれている必要があり、Perlはこの目的で配列@_を使用します。

于 2012-07-07T21:26:04.240 に答える
2

すべての perl サブルーチンの引数は、あなたの本で言及されていないパラメーターの配列内に存在します。

この配列は@_であり、あなたのケースでshiftは、スカラーになる最初の引数を取得する必要があります。

于 2012-07-07T21:03:55.257 に答える