此语法有效:
$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)
理想情况下,我希望能够稍后将数组作为数组返回。
答案 0 :(得分:35)
您缺少的部分是@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}
中显示(反之亦然)。
答案 1 :(得分:15)
您需要阅读有关参考资料的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;
这一切都很好。你没有意识到的是[]为数组创建了引用,你不能将它存储在数组变量中。您必须将其存储在标量中。因此,这反而:
$c = [1, 2, 3];
$x{'else'} = $c;
会奏效。
在执行第二次分配之前访问和修改数组可以使用:
完成$c->[3] = '4';
或以数组形式使用首先取消引用
push @$c, 5;
答案 2 :(得分:0)
您的示例帮助我解决了哈希问题。最后用以下代码结束我的代码:
# Following is confusing as hell. We look to store in the hash an array reference.
# But must convert back and fort via an scalar, since actual arrays returned
# from an hash are copies in perl. i.e. my @a = $lists{$e}; will not work.
my $a = $lists{$e};
if(!$a){$a=();$lists{$e} = \@{$a};}
push @{$a}, $v;
非常感谢。 会