次の行はどういう意味でしょうか?
my $x = shift;
shift()
は、配列を引数として取り、その配列の最初の項目を返し、削除するPerlの組み込みサブルーチンです。 shift
呼び出しでサブルーチンに渡されるすべてのパラメーターを取得するのが一般的な方法です。たとえば、3つの引数を取るサブルーチンfoo
があるとします。これらのパラメータをローカル変数に割り当てるには、次のようにshift
を使用します。
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
ここでの混乱は、shiftが引数として配列を渡されていないように見えることです。実際、暗黙的に "default"配列(@_
サブルーチン内または@ARGV
サブルーチンの外。
shift
関数は、配列から最初の要素を削除して返します。配列は1つの要素で短縮されます。
デフォルトの配列(パラメーターとして指定されていない場合)は@_
関数を使用している場合、または@ARGV
ファイルスコープにいる場合。
したがって、この場合は$x
は、最初の関数パラメーターまたは最初のコマンドラインパラメーターに設定されています。
Perlでは、引数を明示的に指定しない場合、多くのメソッドがデフォルト変数($_
および@_
)を使用します。コードは次と同じです:
my $x = shift @_;
先にPullMonkeyが指摘したように、サブルーチン内では、@_
にはそのサブルーチンに渡される引数が含まれます( perlsub
で説明)。 shift
は、最初の引数値を@_
から削除して$x
に格納するため、$_[0]
はsecond引数がサブルーチンに渡されます。
これは通常、次のイディオムです。ただし、$ xはサブルーチンに渡される最初のパラメーターに割り当てられたローカル変数です。
my ($x) = @_;
おそらくより明確です(そして引数リストを変更しません)。
サブルーチンを使用している場合、この行は@_
(渡されるパラメーター)でshift
になります。
したがって、$x
は、@_
配列の最初の項目popped
になります。
したがって、通常は$x = shift if @_;
が表示されます
素人の言語では、非常に高レベルのビューから、shiftは配列の最初の要素(左端)を取得し、反対はpopは最後の要素を取得します配列の要素(一番右の部分)。
my @ array1 =(5,6,7,8,9); my $ x = shift @ array1; print "$ x\n"; #5 print "@ array1\n"; #6 7 8 9