次の行は何を意味するのでしょうか?
my $x = shift;
shift()
配列を引数として取り、その配列の最初の項目を返し、削除する組み込みの Perl サブルーチンです。サブルーチンに渡されたすべてのパラメーターを呼び出しで取得するのが一般的な方法shift
です。たとえば、foo
3 つの引数を取るサブルーチンがあるとします。これらのパラメーターをローカル変数に割り当てる方法の 1 つは、次のshift
ようなものです。
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
ここでの混乱は、シフトが引数として配列を渡されていないように見えることです。@_
実際、サブルーチン内またはサブルーチン@ARGV
外にある「デフォルト」配列が暗黙的に渡されます。
このshift
関数は、配列から最初の要素を削除し、それを返します。配列は 1 エレメント分短縮されます。
デフォルトの配列 (パラメーターとして指定されていない@_
場合) は、関数内にいる場合、または@ARGV
ファイル スコープにいる場合です。
したがって、この場合$x
は、最初の関数パラメーターまたは最初のコマンド ライン パラメーターに設定されます。
Perl では、引数を明示的に指定しない場合、多くのメソッドがデフォルト変数 ($_
および) を使用します。@_
あなたのコードは以下と同じです:
my $x = shift @_;
前に PullMonkey が指摘したように、サブルーチン内に@_
は、そのサブルーチンに渡された引数が含まれています ( で説明perlsub
)。shift
から最初の引数の値を削除して@_
に格納する$x
ため、サブルーチンに渡される2 番目$_[0]
の引数が得られます。
$x は、サブルーチンに渡される最初のパラメーターに割り当てられたローカル変数です。
my ($x) = @_;
おそらくより明確です(そして、引数リストを変更しません)。
サブルーチンにいる場合、この行はshift
オンになります@_
(渡されるパラメーター)。
配列$x
の最初の項目になりpopped
ます@_
。
だから通常あなたは見るでしょう$x = shift if @_;