web-dev-qa-db-ja.com

変数に「シフト」を割り当てるとはどういう意味ですか?

例:

use strict;
my $file = shift;

open(IN, $file) || die "Unable to open $file\n";
open(OUT, ">$file.$$") or die $!;

my $file = shiftはどうなっていますか?

21
sean curran

メインプログラムで使用する場合、プログラムの引数リストである@ARGVからの最初の値をshift(削除して返す)します。サブルーチン内で使用すると、最初の値がサブルーチンの引数リストである@_からシフトされます。詳細は documentation を参照してください。

28
TLP

shiftのドキュメントを読むことができます。それは非常に明確です。 shiftは配列を受け入れ、最初の要素を抽出します(実際には配列から削除します)。配列を指定しない場合は、@ARGV(プログラムのコマンドラインへの引数)を使用してデータを読み取ります。関数内にいる場合は、@_、つまり関数のパラメーターを使用します。

例:

my @array = (1, 2, 3);
my $value = shift @array;
print $value; # will print '1'
14
Diego Sevilla

shiftは、関数に渡される値を含む@_変数を使用します。shiftが関数の外部で参照されている場合、shiftは、スクリプト自体に渡される値に@ARGVを使用します。

注意事項:特にWindowsで、多くのパスにスペースが含まれている場合は、スクリプトまたは関数に渡すときにファイル名とパスを一重引用符で囲むのが賢明です。これは、値の配列ではなく、単一のスカラー値を渡すことをPerlに通知します。名前の一部を補間する場合は、二重引用符を使用できます。例えば:

my $path = 'C:\Goat Kids';
func("$path\\goat.txt");

または、ファイル名をスクリプトに直接渡す場合は、コマンドラインから:

Perl goat.pl "C:\Goat Kids\goat.txt"
5
Smartnor

以前の回答では、shiftの仕組みについて説明しました。自分のプログラムで使用することがなぜ良いのかについてコメントしたいと思います。

デフォルトでは、Perlは参照渡し言語です。サブルーチンがその引数を変更すると、呼び出し側はこれらの、時には予期しない変更を確認します。 shiftを使用してサブルーチンの引数をプライベート変数に割り当てることをお勧めします。このように、変更を加えても、呼び出し元には表示されません。たとえば、以下のコードは出力します

1
2
2

最初のサブルーチンは引数を変更し、呼び出し元は変更を確認します。 2番目のサブルーチンはプライベートを変更します 写す その引数の、そしてこの変更は呼び出し元に表示されません。

use strict;
use warnings;

sub pass_by_ref {
    $_[0] = 2;
}

sub pass_by_value {
    my $x = shift @_;
    $x = 3;
}

my $x = 1;
print $x, "\n";
pass_by_ref($x);
print $x, "\n";
pass_by_value($x);
print $x, "\n";
2
user335958