連鎖的にハッシュを使用する

連鎖的な方法でハッシュを使用すると、私は多くのことを混乱させます。例えば、私は以下のPerlコードを読んで、それをどのように理解するのですか?

$model->{result}->{forcast}->[$index]->{label}  = 1;

$Neg{$examples->{result}->[$index]->{title}} = 1

さらに、$ indexのように$を持つ項目がいくつあるのか?ラベルのようなものはありません。

$インデックスは[]で囲まれ、その他は{}で囲まれていますが、違いは何ですか?

Is $Neg{$examples->{result}->[$index]->{title}} = 1 equivalent to $Neg{$examples->{result}->[$index]->{title}} = 1

2

2 答え

検討してください:

$model->{result}->{forcast}->[$index]->{label}  = 1;

->[] is used to dereference an array reference.
->{} is used to dereference a hash reference.

左からスキャンしてみましょう:

  • $model is a hash reference (due to it being used in the context: $model->{})
  • result is a hash key (as it does not have a $ sigil prepended)
  • $model->{result} is again a hash reference
  • $model->{result}->{forcast} is an array reference (due to it being used in the context: $model->{result}->{forcast}->[])
  • $index is a variable set by the user that possibly contains the index of an array item
  • $model->{result}->{forcast}->[$index] is a hash reference
  • label is a hash key
  • $model->{result}->{forcast}->[$index]->{label} sets 1 as the value for the hash key

ハッシュキーは、自動的にクォートされますbarewordsすることができます。したがって、 result または 'result' としてハッシュキーを指定することは同じです。

perldoc perldsc is the cookbook for data structures. Data::Dumper is very helpful in viewing such data structures.

6
追加された

引用のないようなプレーンテキストのハッシュキーは使用しないでください。これ言ってみて:

$model->{'result'}->{'forcast'}->[$index]->{'label'} = 1

だからmodelはハッシュリファレンスで、ハッシュリファレンスのkey 'result'を持っています。これはキー 'forcast'(スペルはできません)を持っています。これはarrayrefです。インデックス $ index ハッシュリファレンスは、1に設定されているキー 'label'を持っています。

2番目の例では、%Neg は、ネストされたハッシュと配列のチェーンから 'title'要素であるキーを持つハッシュです。

あなたの最後の質問については、あなたが同じことを二度書いたからです。

4
追加された
ハッシュキーの引用符を省いても問題ありません。キーに空白が含まれていない限り、正常に動作します。
追加された 著者 friedo,
引用符で囲まれていないハッシュキーの使用に関する警告はありません。
追加された 著者 friedo,
個人的には、ハッシュキー内の余分な視覚的ノイズが気になることが分かりましたが、それはMHOだけです。
追加された 著者 friedo,
いいえ、それは完璧ではありません。それは動作し、警告をトリガーしませんが、余分な視覚的な手がかりは常に引用符を含む価値があります。
追加された 著者 ysth,
引用符で囲まれていない識別子はハッシュキーとして完全にうまくいきます。厳密なエラーはありません。警告はありません。
追加された 著者 ikegami,
ベストプラクティスのように、警告を使用している場合を除きます。あなたが警告を使用していない場合、あなたは悪い人です。
追加された 著者 Dan,