この構文は機能します:
$b{"x"} = [1,2,3];
pp %b;
# Displays ("x", [1, 2, 3])
しかし、配列のコンテンツを動的に作成し、後で割り当てることができる必要があります。これは動作しません; ヘルプ、欠けている明らかな部分は何ですか?
@a = [1,2,3];
$b{"x"} = @a;
pp %b;
# Shows up as ("x", 1) ... not what I want or expected.
これらのバリエーションも試してみました。
$b{"x"} = [@a]; # ("x", [[1, 2, 3]]) ...close
$b{"x"} = \@a; # ("x", [[1, 2, 3]])
$b{"x"} = [\@a]; # ("x", [[[1, 2, 3]]])
$b{"x"} = %a; # ("x", 0)
$b{"x"} = $a; # ("x", undef)
$b{"x"} = [$a]; # ("x", [undef])
$b{"x"} = @{@a}; # ("x", 0)
そして、理想的には、配列を後で配列として取得できるようにしたいと考えています。
欠けているのは、_@a = [1,2,3]
_が3つの要素を持つ配列を作成しないことです。これは、arrayrefである1つの要素で配列を作成します。
あなたは@a = (1,2,3)
を意味しました。
その配列をハッシュ要素に割り当てるには、何をしようとしているかに応じて、_$b{"x"} = [@a]
_または_$b{"x"} = \@a
_を使用します。 _[@a]
_は、_@a
_の現在の内容のコピーを含む新しいarrayrefを作成します。その後_@a
_の内容が変更されても、_$b{x}
_には影響しません。
一方、_\@a
_は_@a
_自体への参照を提供します。次に_@a
_の内容を変更すると、それは_$b{x}
_に表示されます(逆も同様です)。
参照について説明している perlref のドキュメントを読む必要があります。
配列の格納方法には違いがあります。
# this is an array in an array variable
@a = (1, 2, 3);
配列への参照を格納する詩:
# this is an array in a scalar variable stored as a reference to the previous array:
$b = \@a;
機能的にはポインタのように機能します。したがって、この参照をハッシュに保存することもできます。
$x{'something'} = \@a;
これはすべてうまくいきます。気づいていないのは、配列への[]がreferencesを作成することです。これは、配列変数に格納できません。スカラーに格納する必要があります。したがって、これは代わりに:
$c = [1, 2, 3];
$x{'else'} = $c;
動作します。
また、2番目の割り当てを行う前に配列にアクセスして変更するには、次の方法を使用できます。
$c->[3] = '4';
またはそれを配列形式で使用する最初に逆参照する
Push @$c, 5;