访问列表作为哈希

stu*_*42j 6 syntax perl hash list

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

$foo = (qw(a b c))[2]; # $foo = "c"
Run Code Online (Sandbox Code Playgroud)

我可以为哈希分配一个列表:

%h = (a=>0, b=>1, c=>2);
$foo = $h{c}; # $foo = 2
Run Code Online (Sandbox Code Playgroud)

那么,为什么我不能直接将列表视为哈希?

$foo = (a=>0, b=>1, c=>2){c}; # Syntax error
Run Code Online (Sandbox Code Playgroud)

我能找到的最接近的是创建一个hashref:

$foo = {a=>0, b=>1, c=>2}->{c};
Run Code Online (Sandbox Code Playgroud)

是否有正确的语法来将列表作为哈希访问,或者为什么不是?

fri*_*edo 6

您不能将列表用作哈希,因为列表不是哈希值.:)

=>("胖逗号")运算符是一样的,,具有额外的功能,它引用在左手侧裸字.所以当你写这个:

( a=>0, b=>1, c=>2 )
Run Code Online (Sandbox Code Playgroud)

它与此完全相同:

( 'a', 0, 'b', 1, 'c', 2 )
Run Code Online (Sandbox Code Playgroud)

这不是哈希,它只是一个列表.

列表是生活在堆栈中的短暂事物; 正确地指出它们可以分配给数组和散列,但它们与数组和散列不同.

在使用哈希之前需要构造哈希.分配给它的任何键/值列表需要对键进行散列并分配存储桶,并将值放在存储桶中.所以当你写:

$foo = {a=>0, b=>1, c=>2}->{c};
Run Code Online (Sandbox Code Playgroud)

发生的事情是:

  1. 列表中的元素('a',0,'b',1,'c',2)被放入堆栈中
  2. 匿名哈希由{ LIST }运营商构建
  3. 列表元素从堆栈中弹出并分配给哈希,将它们转换为键和值
  4. 返回对该哈希的引用.
  5. 该引用被->运营商解除引用
  6. 关键c是查找,并且
  7. 它的值返回,将表达式减少到 $foo = 2

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

这是一篇非常酷的家伙的文章,你也可以发现它具有启发性:Perl中的数组与列表:有什么区别?