6

リスト内の要素に直接アクセスできます。

$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

私が見つけることができる最も近いものは、ハッシュリファレンスを作成することです:

$foo = {a=>0, b=>1, c=>2}->{c};

リストにハッシュとしてアクセスするための正しい構文はありますか?

4

2 に答える 2

6

リストはハッシュではないため、リストをハッシュとして使用することはできません。:)

( =>"太いカンマ") 演算子は と同じですが,、左側で裸の単語を引用するという追加機能があります。したがって、これを書くとき:

( a=>0, b=>1, c=>2 )

これとまったく同じです:

( 'a', 0, 'b', 1, 'c', 2 )

これはハッシュではなく、単なるリストです。

リストは、スタック上に存在する一時的なものです。あなたが正しく指摘しているように、それらは配列とハッシュの両方に割り当てることができますが、配列とハッシュと同じではありません。

ハッシュは、使用する前に構築する必要があります。それに割り当てられたキー/値リストは、キーをハッシュし、バケットを割り当て、値をバケットに配置する必要があります。だからあなたが書くとき:

$foo = {a=>0, b=>1, c=>2}->{c};

何が起こっているのですか:

  1. リスト内の要素 ( 'a', 0, 'b', 1, 'c', 2 ) がスタックに置かれます
  2. 匿名ハッシュは{ LIST }オペレーターによって構築されます
  3. リスト要素はスタックからポップされ、ハッシュに割り当てられ、キーと値に変換されます
  4. そのハッシュへの参照が返されます。
  5. 参照は->演算子によって逆参照されます
  6. キーcを検索し、
  7. その値が返され、式が$foo = 2

では、なぜ(qw(a b c))[2]リストが配列でないのに書けるのでしょうか? 内部的には、スタックは単に の配列なSV *ので、添え字を付ける機能を配置するのは簡単で、良いアイデアのように思えたと思います。

これは、非常にクールな人物による記事で、あなたにも啓発されるかもしれません: Arrays vs. Lists in Perl: What's the Difference?

于 2013-09-19T21:12:18.447 に答える
0

いいえ。リストはハッシュではないためです。あなたができる最も近いのは

my $foo = (a=>0,b=>1,c=>2)[5]; 
printf("$foo\n");

どちらが印刷されますか

2

上記のコードは

my $foo = ('a',0,'b',1,'c',2)[5]; 
printf("$foo\n");
于 2013-09-19T21:23:31.903 に答える