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
------------------

perlmodperldata追加ドキュメント。 参照がPerlの一部となる前の頃、このイディオムは配列とハッシュをサブルーチンに渡すのに役立ちました。





glob