2011-12-19 8 views
2

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

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

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

また、$ indexのように$があるアイテムがあります。ラベルのようなものはありません。

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

は、あなたが引用することなく、そのようなプレーンテキストのハッシュキーを持つべきではありません$Neg{$examples->{result}->[$index]->{title}} = 1

答えて

6

は検討:

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

->[]が配列参照逆参照するために使用されます。
->{}は、ハッシュリファレンスを逆参照するために使用されます。それは持っていないよう

  • resultは(ハッシュキーである:($model->{}それは文脈で使用されることに起因する)

    • $modelはハッシュリファレンスです:

      私たちは左から、それをスキャンしてみましょう$シギルは、それが文脈で使用されることに起因

    • $model->{result}が(再度配列リファレンスハッシュ参照
    • $model->{result}->{forcast}である)プリペンド:$model->{result}->{forcast}->[]
    • $indexは、おそらく配列項目
    • $model->{result}->{forcast}->[$index]のインデックスを含むユーザによって設定された変数は、ハッシュキーの値としてハッシュキー
    • $model->{result}->{forcast}->[$index]->{label}セット1ハッシュ参照
    • labelさであります

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

    perldoc perldscは、データ構造のクックブックです。 Data::Dumperは、そのようなデータ構造を見るのに非常に役立ちます。

  • -4

    に相当$Neg{$examples->{result}->[$index]->{title}} = 1です。これを言う:

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

    ので、モデルはハッシュリファレンスで、それは(綴ることができない?)キー「予報」を持っている、ハッシュリファレンスであるキー「結果」を持っている配列リファレンスである、どのインデックスで$indexには、1に設定されているキー 'label'を持つhashrefがあります。

    %Negは、ネストされたハッシュのチェーンから 'title'要素であるキーを持つハッシュです。アレイ。

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

    +1

    ハッシュキーの引用符を省略しても問題ありません。キーに空白が含まれていない限り、正常に動作します。 – friedo

    +0

    警告を使用している場合を除き、ベストプラクティスです。あなたが警告を使用していない場合、あなたは悪い人です。 – Dan

    +1

    引用符で囲まれていないハッシュキーの使用に関する警告はありません。 – friedo

    関連する問題