エイリアスがperlで配列パラメータを渡したという意味は何ですか? 次のコードは正しいですか?
#!/usr/bin/perl
@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
エイリアスがperlで配列パラメータを渡したという意味は何ですか? 次のコードは正しいですか?
#!/usr/bin/perl
@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
このコード:
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
サブルーチンに渡された配列のコピーを作成します。これは、元の配列を変更せずにサブルーチン内の配列を変更する場合に適しています。
最近の Perl でサブルーチンを呼び出す正しい方法は、my_sub(@myarray);
. を使用しないでください&
。
エイリアスという用語は、参照の構文上の制限なしに、複数の名前が同じデータを指すことができることを示しています。
Perlでは、エイリアスはたとえばによって任意に作成できますが、Data::Alias
エイリアスを自分で作成する構造がいくつかあります。
foreachループ。現在の要素は、リスト内の元の要素のエイリアスです。
my @array = 1 .. 5;
for my $elem (@array) {
$elem++; # $elem is an alias to $array[$i]
}
# the @array is now 2 .. 6.
サブルーチン引数。Perlサブルーチンは、スカラーのフラットリストで呼び出されます(つまり、ハッシュや配列などのコレクションはこのリストにフラット化されます)。@_
このリストには、アレイからアクセスできます。この配列のすべての要素は、パラメーターのエイリアスです。
sub alias_increment {
for my $elem (@_) {
$elem++;
}
}
my @array = 1 .. 5;
alias_increment(@array);
# array now is 2 .. 6.
@_
この例では、はのエイリアスではなく、のエイリアスで@array
あることに注意してください。$_[$i]
$array[$i]
これらのエイリアスを使用すると、議論の余地がありますが、それは厄介なAPIになります。
また、Perlには通常コピーセマンティクスがあることにも注意してください。これは、ステートメント$foo = $bar
が通常のデータをにコピーすることを意味します。コピーは別個のエンティティであり、オリジナルがエイリアスであった場合、コピー自体はエイリアスにはなりません。リストコンテキストでコピーする場合、すべての要素がコピーされます。この意味は$bar
$foo
my @array = @_;
と同じことをします
my @array;
$array[0] = $_[0];
# ...
これにより、すべてのエイリアシングが解除されます。
これは実際、Perlで「値による呼び出し」を行うためのパターンとして使用され、サブルーチンの副作用を制限することができます。