perl glob grep
Perl globの解説(*) (2)
Perlに関する私の知識は、私の言うところによれば知識が少なくなっているので、私は答えを模索するつもりです。 *演算子は、シンボルテーブルエントリを割り当てます。 私が理解しているように、@array、%array、$ arrayはすべて、文字列 'array'の同じシンボルテーブルエントリを参照しますが、そのエントリの異なるフィールドにはARRAY、HASH、およびSCALARフィールドがあります。 したがって、 local *array = shift;
代入しlocal *array = shift;
実際には、ARRAY、HASH、およびSCALARフィールドを含む 'array'のローカルシンボルテーブルエントリ全体が、呼び出し元で使用されたものに割り当てられます。
この質問では、ポスターは次の行を1行で行う方法を尋ねました。
sub my_sub {
my $ref_array = shift;
my @array = @$ref_array;
}
基本的なPerlの魔法について私が知っている限り、私は単純に次のようなものを使うことで回避します。
sub my_sub {
my $ref_array = shift;
for (@$ref_array) {
#do somthing with $_ here
};
#use $ref_array->[$element] here
}
しかし、 この答えでは、SOの地元の修道士の1人が示唆した:
sub my_sub {
local *array = shift();
#use @array here
}
私が尋ねたとき
Perlの中級レベルの魔法を学ぼうとすると、ここに何を置いているのですか? @arrayへの参照を渡された配列参照に設定していますか? %arrayまたは$ arrayではなく、@arrayを作成することをどのように知っていますか? この*演算子(perlop?)の詳細はどこで知ることができますか? ありがとう!
私はそれを新しい投稿として尋ねるよう勧められましたが、彼は素敵な言及をしました。 とにかく、ここに行く? 誰かが何に割り当てられているかを説明してください。おそらく%arrayまたは$ arrayではなく@arrayがどのように作成されますか? ありがとう。
グロブへの代入
*glob = VALUE
VALUE
の型(すなわち、 Scalar::Util::reftype(VALUE)
戻り値)に依存するいくつかの魔法が含まれています。 VALUE
がスカラ、配列、ハッシュ、またはサブルーチンへの参照である場合、シンボルテーブル内のそのエントリだけが上書きされます。
このイディオム
local *array = shift();
#use @array here
サブルーチンへの最初の引数が配列参照のときに文書化されています。 代わりに最初の引数がスカラー参照であれば、代入によって$array
と@array
だけが影響を受けます。
何が起こっているかを見るための小さなデモスクリプト:
no strict;
sub F {
local *array = shift;
print "\@array = @array\n";
print "\$array = $array\n";
print "\%array = ",%array,"\n";
print "------------------\n";
}
$array = "original scalar";
%array = ("original" => "hash");
@array = ("orignal","array");
$foo = "foo";
@foo = ("foo","bar");
%foo = ("FOO" => "foo");
F ["new","array"]; # array reference
F \"new scalar"; # scalar reference
F {"new" => "hash"}; # hash reference
F *foo; # typeglob
F 'foo'; # not a reference, but name of assigned variable
F 'something else'; # not a reference
F (); # undef
出力:
@array = new array $array = original scalar %array = originalhash ------------------ @array = orignal array $array = new scalar %array = originalhash ------------------ @array = orignal array $array = original scalar %array = newhash ------------------ @array = foo bar $array = foo %array = FOOfoo ------------------ @array = foo bar $array = foo %array = FOOfoo ------------------ @array = $array = %array = ------------------ @array = orignal array $array = original scalar %array = originalhash ------------------
perlmod
とperldata
追加ドキュメント。 参照がPerlの一部となる前の頃、このイディオムは配列とハッシュをサブルーチンに渡すのに役立ちました。