Perl:将数组分配给哈希

时间:2011-03-21 23:08:21

标签: arrays perl syntax hash

此语法有效:

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

理想情况下,我希望能够稍后将数组作为数组返回。

3 个答案:

答案 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;

非常感谢。 会