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)
是否有正确的语法来将列表作为哈希访问,或者为什么不是?
您不能将列表用作哈希,因为列表不是哈希值.:)
该=>("胖逗号")运算符是一样的,,具有额外的功能,它引用在左手侧裸字.所以当你写这个:
( 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)
发生的事情是:
{ LIST }运营商构建->运营商解除引用c是查找,并且$foo = 2那么,(qw(a b c))[2]如果列表不是数组,为什么还要写?好吧,在内部堆栈只是一个数组,SV *所以我想,把它下标的能力很简单,看起来是个好主意.
这是一篇非常酷的家伙的文章,你也可以发现它具有启发性:Perl中的数组与列表:有什么区别?