perl - 访问列表作为哈希

标签 perl list hash syntax

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

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

    相关文章:

    perl - SVN::Client中的SVN登录访问提示

    python - 计算 GCD - 如何检查列表中的每个元素

    hash - 使用 golang 生成字符串的 SHA 哈希

    perl - mod_perl 并在子进程中继承 STDIN

    c# - 是否有与 Perl 的 HTML::TableExtract 等效的 C#?

    perl - POSIX pselect 在 Perl 中可用吗?

    c# - 按键/属性将列表分组为子列表而不更改列表顺序(只需按属性切入列表)

    list - 为什么在具体化中将 clpfd 变量分配给实际值?

    c# - 在 .Net 运行时为测试用例散列 float

    algorithm - SHA256 彩虹表的归约算法