Perl:将数组分配给哈希

Wal*_*ner 19 arrays syntax perl hash

此语法有效:

$b{"x"} = [1,2,3];
pp %b;
# Displays ("x", [1, 2, 3]) 
Run Code Online (Sandbox Code Playgroud)

但是我需要能够动态创建数组的内容并在以后分配它.这不起作用; 帮助,我错过的显而易见的部分是什么?

@a = [1,2,3];
$b{"x"} = @a;
pp %b;
# Shows up as ("x", 1) ... not what I want or expected.
Run Code Online (Sandbox Code Playgroud)

也试过这些变化.

$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) 
Run Code Online (Sandbox Code Playgroud)

而且,理想情况下,我希望能够稍后将阵列作为阵列退出.

cjm*_*cjm 37

您缺少的部分是@a = [1,2,3]不会生成包含3个元素的数组.它创建一个带有一个元素的数组,它是一个arrayref.

你的意思@a = (1,2,3).

要将该数组分配给哈希元素,您可以使用$b{"x"} = [@a]或者$b{"x"} = \@a,具体取决于您尝试执行的操作. [@a]创建一个包含当前内容副本的新arrayref @a.如果之后的内容发生@a变化,则对其没有影响$b{x}.

另一方面,\@a给你一个@a自己的参考.如果您随后更改了内容@a,则会显示$b{x}(反之亦然).


Wes*_*ker 15

您需要阅读有关引用的perlref文档.

数组的存储方式有所不同:

# this is an array in an array variable
@a = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

Verse存储对数组的引用:

# this is an array in a scalar variable stored as a reference to the previous array:
$b = \@a;
Run Code Online (Sandbox Code Playgroud)

功能上像指针一样工作.因此,您还可以将此引用存储在哈希中:

$x{'something'} = \@a;
Run Code Online (Sandbox Code Playgroud)

这一切都很好.你没有意识到的是[]创建了对数组的引用,你不能将它存储在数组变量中.您必须将其存储在标量中.因此这反而:

$c = [1, 2, 3];
$x{'else'} = $c;
Run Code Online (Sandbox Code Playgroud)

将工作.

在执行第二次分配之前访问和修改数组可以使用以下方法完成:

$c->[3] = '4';
Run Code Online (Sandbox Code Playgroud)

或者以数组形式使用它,首先取消引用它

push @$c, 5;
Run Code Online (Sandbox Code Playgroud)