web-dev-qa-db-ja.com

Perlでshift()は何をしますか?

次の行はどういう意味でしょうか?

my $x = shift;
66
cam

shift()は、配列を引数として取り、その配列の最初の項目を返し、削除するPerlの組み込みサブルーチンです。 shift呼び出しでサブルーチンに渡されるすべてのパラメーターを取得するのが一般的な方法です。たとえば、3つの引数を取るサブルーチンfooがあるとします。これらのパラメータをローカル変数に割り当てるには、次のようにshiftを使用します。

sub foo() {
  my $x = shift;
  my $y = shift;
  my $z = shift;
  # do something
}

ここでの混乱は、shiftが引数として配列を渡されていないように見えることです。実際、暗黙的に "default"配列(@_サブルーチン内または@ARGVサブルーチンの外。

54
cowgod

shift関数は、配列から最初の要素を削除して返します。配列は1つの要素で短縮されます。

デフォルトの配列(パラメーターとして指定されていない場合)は@_関数を使用している場合、または@ARGVファイルスコープにいる場合。

したがって、この場合は$xは、最初の関数パラメーターまたは最初のコマンドラインパラメーターに設定されています。

14
Alnitak

Perlでは、引数を明示的に指定しない場合、多くのメソッドがデフォルト変数($_および@_)を使用します。コードは次と同じです:

my $x = shift @_;

先にPullMonkeyが指摘したように、サブルーチン内では、@_にはそのサブルーチンに渡される引数が含まれます( perlsub で説明)。 shiftは、最初の引数値を@_から削除して$xに格納するため、$_[0]second引数がサブルーチンに渡されます。

6
Gaurav

これは通常、次のイディオムです。ただし、$ xはサブルーチンに渡される最初のパラメーターに割り当てられたローカル変数です。

my ($x) = @_;

おそらくより明確です(そして引数リストを変更しません)。

2
David Nehme

サブルーチンを使用している場合、この行は@_(渡されるパラメーター)でshiftになります。
したがって、$xは、@_配列の最初の項目poppedになります。

したがって、通常は$x = shift if @_;が表示されます

0
PullMonkey

素人の言語では、非常に高レベルのビューから、shiftは配列の最初の要素(左端)を取得し、反対はpopは最後の要素を取得します配列の要素(一番右の部分)。

 my @ array1 =(5,6,7,8,9); 
 my $ x = shift @ array1; 
 print "$ x\n"; #5 
 print "@ array1\n"; #6 7 8 9 
0
mhd