次の行は何を意味するのでしょうか?
my $x = shift;
shift()配列を引数として取り、その配列の最初の項目を返し、削除する組み込みの Perl サブルーチンです。サブルーチンに渡されたすべてのパラメーターを呼び出しで取得するのが一般的な方法shiftです。たとえば、foo3 つの引数を取るサブルーチンがあるとします。これらのパラメーターをローカル変数に割り当てる方法の 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 @_;