74

次の行は何を意味するのでしょうか?

my $x = shift;
4

6 に答える 6

63

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

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

ここでの混乱は、シフトが引数として配列を渡されていないように見えることです。@_実際、サブルーチン内またはサブルーチン@ARGV外にある「デフォルト」配列が暗黙的に渡されます。

于 2008-11-17T21:27:25.853 に答える
15

このshift関数は、配列から最初の要素を削除し、それを返します。配列は 1 エレメント分短縮されます。

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

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

于 2008-11-17T21:24:21.117 に答える
10

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

my $x = shift @_;

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

于 2008-11-18T05:25:47.153 に答える
3

簡単に言うと、非常に大まかに言えば、shiftは配列の最初の要素 (一番左の部分) を取得し、反対はpopで配列の最後の要素 (一番右の部分) を取得します。

私の @array1=(5,6,7,8,9);
私の $x = シフト @array1;
print "$x\n"; #5
print "@array1\n"; # 6 7 8 9
于 2008-11-21T02:59:19.817 に答える
3

$x は、サブルーチンに渡される最初のパラメーターに割り当てられたローカル変数です。

my ($x) = @_;

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

于 2008-11-17T21:17:57.980 に答える
1

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

だから通常あなたは見るでしょう$x = shift if @_;

于 2008-11-17T21:25:40.133 に答える