リストはハッシュではないため、リストをハッシュとして使用することはできません。:)
( =>
"太いカンマ") 演算子は と同じですが,
、左側で裸の単語を引用するという追加機能があります。したがって、これを書くとき:
( 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 }
オペレーターによって構築されます
- リスト要素はスタックからポップされ、ハッシュに割り当てられ、キーと値に変換されます
- そのハッシュへの参照が返されます。
- 参照は
->
演算子によって逆参照されます
- キー
c
を検索し、
- その値が返され、式が
$foo = 2
では、なぜ(qw(a b c))[2]
リストが配列でないのに書けるのでしょうか? 内部的には、スタックは単に の配列なSV *
ので、添え字を付ける機能を配置するのは簡単で、良いアイデアのように思えたと思います。
これは、非常にクールな人物による記事で、あなたにも啓発されるかもしれません: Arrays vs. Lists in Perl: What's the Difference?