2016-10-25 9 views
1

のハッシュへのリファレンス:Perlの - 私は次のコードを持っているハッシュ

REF(0x35c320)Cleopatra 

を、私は本当に理由を理解していない:

my $hhref = {'ancient' => {'Adam' => 'Eve', 
          'Antony' => 'Cleopatra'}, 
      'modern' => {'Clyde' => 'Bonnie'}}; 
print "$hhref->{'ancient'}{'Antony'}\n"; 

出力します。なぜそれは単にCleopatraを印刷しないのですか?

ありがとうございます!

+0

本当に 'REF(0x35c320)'を出力しますか?私はPerlが "REF"の前に参照を印刷することは見たことがありません。通常、 "HASH"、 "ARRAY"などの参照の種類になります。 –

+0

私がテストしたPerlのすべてのバージョンで、このコードは正しいことをします。余分な参照は表示されません。このコードだけを実行すると、余分な参照が表示されますか?私は出力はあなたが私たちを見せていない他のコードによって生成されると思います。このコード(およびこのコードのみ)が表示する出力を生成する場合は、[edit your question](http://stackoverflow.com/posts/40231134/edit)を使用して、使用しているPerlのバージョンとオペレーティングシステムを追加してください。 –

答えて

1

どのバージョンのperlとどのOSを使用しているかによって、少し異なる結果が得られます。問題は実際にあなたのprintステートメントに引用符があることから来ます。代わりにコードが

my $hhref = {'ancient' => {'Adam' => 'Eve', 
         'Antony' => 'Cleopatra'}, 
     'modern' => {'Clyde' => 'Bonnie'}}; 
print $hhref->{'ancient'}{'Antony'}; 
print "\n"; 

の場合は正しく印刷されます。どうして?まあ、Perlはあなたが何を意味しているのか理解できません。あなたは "$ hhref"の後に " - > {'ancient'} {'Antony'}"とか、 "$ hhref - > {'ancient'}"、 "{'ancient'}" 1つの変数としてすべてが一緒ですか?文字列の外側ではコンパイラは正確ですが、文字列の中では、空白がコード内にあるように決定的に使用されるのではなく、空白が使用されていることを推測する必要があります。

基本的に、変数が毎回正しく解釈されるようにしたい場合は、perlの引用符の外でそれらを参照してください。

+0

大丈夫、ありがとう! – Gambit2007

+0

@ Gambit2007その動作は[perlop](http://perldoc.perl.org/perlop.html#Gory-details-of-parsing-quoted-constructs)の「補間」の段落に記載されています。 「ヒューリスティックな見積もり者」、「厳密に予測できない」、「通常は正しい」と言います。 – Dada

+1

これは私にとって正しいことではありません。 「Cleopatra」を印刷していることを考えると、Perlは明らかにデータ構造を正しく歩いています。 'REF(0x35c320)'はここでは見ていないコードで生成しなければなりません。あなたが指摘したドキュメントは、 's ///'のような演算子でテキストを解析することです。これは現在の状況とは関係ありません。 –

関連する問題