プロが教える店舗&オフィスのセキュリティ対策術

はじめまして。

現在、業務で他人の書いたコード(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となるのも確認しています。
これもどうしてそうなるのか、根本的な原理が分かっておりません。

どうか、このコードの動作原理を教えていただけないでしょうか。
抽象的な質問となっている気がしますが、宜しくお願いいたします。

A 回答 (2件)

 自動的に作成されるからです。


 Perl の場合、「未定義の変数にはすべて undef が代入ずみ」という仮定になっています。
 よって、宣言していない $data という変数にも、いきなりアクセスできてしまうのです。

 $data->{0} という記述をすると、Perl は自動的にハッシュのリファレンスを構築します。
 理論上は、10次元配列とかでも宣言なしでアクセス可能です。

この回答への補足

大変申し訳ありません。
もう1つ分かっていない点があることが分かりましたので、補足させてください。

まず、
my %data ;

これについては、特別意味がないわけですよね。

その後、突然、
$data->{0}
という記述が出るため、Perlが、$dataは、
「ハッシュのリファレンスである」
と判断し、作成をするわけですね。

となると、その後で、$data{0}
という書き方が可能なのは何故なのでしょうか?
ハッシュのリファレンスにキーをつけて参照や書き込みをするならば、
$data{0}
ではなく、
${$data}{0}
となるような気がするのですが・・・。

もしよろしければ教えてください。

補足日時:2004/11/09 14:08
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

自動的に作成されるということで、
my %data ;
の宣言文をコメントアウトしても、全く同様に動くことが確認できました。

つまり、%dataという実ハッシュ宣言自体は、今回のケースにおいては意味を持たないということですね。

大変分かりやすい回答ありがとうございました。

お礼日時:2004/11/09 13:57

どうやら基本的な部分で誤解されているようなので、補足します。



perl では、$data と %data は全く別の変数を表します。
(ついでに @data も上記の2つとは別変数)

ですから、ご質問のプログラム内の
$data->{0} と $data{0}{test} は別の変数になります。

$data{0}{test} は、2行目で定義されている連想配列を
参照しており、
$data->{0} は、宣言なしでいきなり使用された変数($data)を参照していることになります。

では、2行目に全く意味がないのかというとそうでもなく、
my で宣言していることから変数のスコープ(ローカル変数とかグローバル変数とか)を定義していると考えられます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
本当に根本的な部分で誤解をしていました。

$data, %dataが同時利用可能であることは知りませんでした。
(他の言語でもありうるのでしょうか?)

だとすると、my宣言の意味も分かります。
(質問文に記載したコードでは意味が薄いかもしれませんが・・・)

これで全て分かりました。
皆様本当にありがとうございました。

お礼日時:2004/11/09 14:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!