web-dev-qa-db-ja.com

Perl:配列をハッシュに割り当てる

この構文は機能します:

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

そして、理想的には、配列を後で配列として取得できるようにしたいと考えています。

20

欠けているのは、_@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}_に表示されます(逆も同様です)。

36
cjm

参照について説明している 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;
15
Wes Hardaker