我可以直接访问列表中的元素:
$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};
发生的事情是:
{ LIST }
构造运算符(operator) ->
取消引用运算符(operator) 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/