代码之家  ›  专栏  ›  技术社区  ›  Chris B

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

  •  0
  • Chris B  · 技术社区  · 15 年前

    好的,这是我要创建的整个结构。我需要创建一个可以用作哈希值的匿名数组。这在我的程序中有效:

    $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 回复  |  直到 15 年前
        1
  •  7
  •   cjm    15 年前

    正如其他人提到的,您描述的是一个不寻常的数据结构:一个只有一个元素的数组,它是一个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推到arrayref中 $elements[0] 而不是 @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 您当前使用的位置 @元素 .

    任何一个都可以。由你决定你喜欢哪一个。我可能会选第二个版本。

        2
  •  5
  •   JB.    15 年前

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

    你想用括号直接在那里指定一个列表 () 而不是方括号。

    退房 perldsc 关于这个主题的介绍。

        3
  •  3
  •   dave4420    15 年前

    错误的括号。

    您实际上需要构建这样的结构:

    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});
    

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

    要列出要分配给数组的元素,请使用圆括号 () .

        4
  •  3
  •   runrig    15 年前

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