0, b=>1, c=>2); $foo = $h{-6ren">
gpt4 book ai didi

perl - 访问列表作为哈希

转载 作者:行者123 更新时间:2023-12-04 14:59:34 25 4
gpt4 key购买 nike

我可以直接访问列表中的元素:

$foo = (qw(a b c))[2]; # $foo = "c"

我可以为哈希分配一个列表:
%h = (a=>0, b=>1, c=>2);
$foo = $h{c}; # $foo = 2

那么,为什么我不能直接将列表视为散列呢?
$foo = (a=>0, b=>1, c=>2){c}; # Syntax error

我能找到的最接近的是创建一个 hashref:
$foo = {a=>0, b=>1, c=>2}->{c};

是否有正确的语法来访问列表作为散列或为什么不呢?

最佳答案

您不能将列表用作散列,因为列表不是散列。 :)
=> (“胖逗号”)运算符与 , 相同, 具有在左侧引用裸字的附加功能。所以当你写这个时:

( a=>0, b=>1, c=>2 )

它与此完全相同:
( 'a', 0, 'b', 1, 'c', 2 )

这不是一个散列,它只是一个列表。

列表是存在于堆栈中的短暂事物;正如您正确指出的那样,它们可以分配给数组和散列,但它们与数组和散列不同。

需要先构造散列,然后才能使用它。分配给它的任何键/值列表都需要散列键并分配存储桶以及放置在存储桶中的值。所以当你写:
$foo = {a=>0, b=>1, c=>2}->{c};

发生的事情是:
  • 列表中的元素( 'a', 0, 'b', 1, 'c', 2 )被放入堆栈
  • 匿名散列由 { LIST } 构造运算符(operator)
  • 列表元素从堆栈中弹出并分配给散列,将它们转换为键和值
  • 返回对该哈希的引用。
  • 引用由 -> 取消引用运算符(operator)
  • key c抬头一看,
  • 它的值返回,将表达式简化为 $foo = 2

  • 那你为什么要写 (qw(a b c))[2]如果列表不是数组?好吧,在内部堆栈只是一个数组 SV *所以我想把它下标的能力很简单,看起来是个好主意。

    这是一个非常酷的人写的一篇文章,你可能也会发现它有启发性: Arrays vs. Lists in Perl: What's the Difference?

    关于perl - 访问列表作为哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904728/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com