如何在Perl中使用数组作为哈希值?

时间:2009-09-10 16:22:56

标签: perl arrays

好的,所以这是我正在尝试创建的整个结构。我需要创建一个可以用作哈希值的匿名数组。这适用于我的程序:

$result = {
    count, 2,
    elementList, [
        {name => "John Doe", age => 23},
        {name => "Jane Doe", age => 24}
    ]
};

我正在尝试用这样的代码创建完全相同的东西。这有效:

my @elements = [
     {name => "John Doe", age => 23},
     {name => "Jane Doe", age => 24}
];

$result = {
    count, 2,
    elementList, @elements
};

但这不起作用:

my @elements;
push(@elements, {name => "John Doe", age => 23});
push(@elements, {name => "Jane Doe", age => 24});

$result = {
    count, 2,
    elementList, @elements
};

4 个答案:

答案 0 :(得分:7)

正如其他人所提到的,你正在描述一个不寻常的数据结构:一个只有一个元素的数组,它是一个hashrefs的arrayref。我会假设你出于某种原因确实想要这种结构。

my @elements = [
    {name => "John Doe", age => 23},
    {name => "Jane Doe", age => 24}
];

相当于

my @elements = [];
push(@{ $elements[0] }, {name => "John Doe", age => 23});
push(@{ $elements[0] }, {name => "Jane Doe", age => 24});

因为你想将hashrefs推送到$elements[0]中的arrayref而不是@elements数组。

但是只有一个元素的数组是不寻常的。查看您发布的其他代码,您真正想要的是:

my $elementsRef = [];
push(@$elementsRef, {name => "John Doe", age => 23});
push(@$elementsRef, {name => "Jane Doe", age => 24});

或者这个:

my @elements;
push(@elements, {name => "John Doe", age => 23});
push(@elements, {name => "Jane Doe", age => 24});

然后使用当前使用\@elements的{​​{1}}。

其中任何一个都可以。由您来决定您喜欢哪一个。我可能会选择第二个版本。

答案 1 :(得分:5)

您正在为数组分配数组引用([]语法)。作为第一个也是唯一的元素,因为您没有指定任何其他元素。

您希望直接在其中指定一个列表,使用括号()代替方括号。

查看perldsc以了解有关此主题的介绍。

答案 2 :(得分:3)

错误的括号。

你实际上需要建立一个这样的结构:

my @elements = (
    {name => "John Doe", age => 23},
    {name => "Jane Doe", age => 24}
);

要在循环中执行此操作,您需要修改此代码:

my @elements;  # same as my @elements = ();
push(@elements, {name => "John Doe", age => 23});
push(@elements, {name => "Jane Doe", age => 24});

原因是方括号构建了对数组的引用。对数组的引用与数组不同。

要制作要分配给数组的元素列表,请使用圆括号()

答案 3 :(得分:3)

[]引用一个空数组。您正在创建一个包含一个元素的数组。只需说:my @elements;制作一个空数组。