• ベストアンサー

Perl連想配列の使い方について

はじめまして。 現在、業務で他人の書いたコード(Perl)を改造しているのですが、その作成者がいなくなってしまっております。 そのコードを見ると、なぜ、このような書き方が可能なのか、理解できないので、動作原理を教えていただけないでしょうか? 以下のようなコードです。 ==================================== my @arr = ( "一" , "ニ" , "三" , "四" ) ; my %data ; $data->{0} = \@arr ; $data{0}{test} = "テスト" ; print ${$data->{0}}[1] . "\n" ; print $data{0}{test} . "\n" ; ==================================== 出力はこのようになります。 ニ テスト ここからが質問なのですが、$data->{0}という書き方ができる理由が分からないのです。 $dataが例えば、 my %my_hash ; my $data = \%my_hash ; というように、ハッシュのリファレンスであるならば、$data->{0}という書き方も分かるのですが、定義した時点でリファレンスではない、$dataに、何故"->"の演算子が使えるのでしょうか? とはいえ、 ref $data ; の戻り値がHASHとなるのも確認しています。 これもどうしてそうなるのか、根本的な原理が分かっておりません。 どうか、このコードの動作原理を教えていただけないでしょうか。 抽象的な質問となっている気がしますが、宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 自動的に作成されるからです。  Perl の場合、「未定義の変数にはすべて undef が代入ずみ」という仮定になっています。  よって、宣言していない $data という変数にも、いきなりアクセスできてしまうのです。  $data->{0} という記述をすると、Perl は自動的にハッシュのリファレンスを構築します。  理論上は、10次元配列とかでも宣言なしでアクセス可能です。

lawfer
質問者

お礼

ご回答ありがとうございます。 自動的に作成されるということで、 my %data ; の宣言文をコメントアウトしても、全く同様に動くことが確認できました。 つまり、%dataという実ハッシュ宣言自体は、今回のケースにおいては意味を持たないということですね。 大変分かりやすい回答ありがとうございました。

lawfer
質問者

補足

大変申し訳ありません。 もう1つ分かっていない点があることが分かりましたので、補足させてください。 まず、 my %data ; これについては、特別意味がないわけですよね。 その後、突然、 $data->{0} という記述が出るため、Perlが、$dataは、 「ハッシュのリファレンスである」 と判断し、作成をするわけですね。 となると、その後で、$data{0} という書き方が可能なのは何故なのでしょうか? ハッシュのリファレンスにキーをつけて参照や書き込みをするならば、 $data{0} ではなく、 ${$data}{0} となるような気がするのですが・・・。 もしよろしければ教えてください。

その他の回答 (1)

  • 3rd
  • ベストアンサー率30% (7/23)
回答No.2

どうやら基本的な部分で誤解されているようなので、補足します。 perl では、$data と %data は全く別の変数を表します。 (ついでに @data も上記の2つとは別変数) ですから、ご質問のプログラム内の $data->{0} と $data{0}{test} は別の変数になります。 $data{0}{test} は、2行目で定義されている連想配列を 参照しており、 $data->{0} は、宣言なしでいきなり使用された変数($data)を参照していることになります。 では、2行目に全く意味がないのかというとそうでもなく、 my で宣言していることから変数のスコープ(ローカル変数とかグローバル変数とか)を定義していると考えられます。

lawfer
質問者

お礼

回答ありがとうございます。 本当に根本的な部分で誤解をしていました。 $data, %dataが同時利用可能であることは知りませんでした。 (他の言語でもありうるのでしょうか?) だとすると、my宣言の意味も分かります。 (質問文に記載したコードでは意味が薄いかもしれませんが・・・) これで全て分かりました。 皆様本当にありがとうございました。

関連するQ&A