- 締切済み
スカラーをハッシュのように扱えるのでしょうか
お世話になります。既存のプログラムを読んでいて下記のような 個所を見つけました。 --------------------------------------------- ★この前にDBアクセス処理(prepare execute等) undef @JCOL; while ($rc = $DBr->fetchrow_hashref) { my($REC); $REC->{YEAR} = $rc->{'年度'}; $REC->{BUNYA} = $rc->{'分野名称'}; push(@JCOL, $REC); } $DBr->finish; return (1, \@JCOL); } --------------------------------------------- 私がこの3ヶ月独自で勉強してきた中で上記のような場合は my($REC); ではなく my(%REC); で、$REC{YEAR}という中に代入していたのですが、 上記のような形は初めてで戸惑っています。 動いてるプログラムなので、これでもよいのかもしれませんが、 スカラー変数にキーを持たせることができるのでしょうか? また、 $REC{YEAR}= $rc->{'年度'}; とするのとはどのように違うのですか? よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- buffalomasa
- ベストアンサー率66% (70/106)
RECがハッシュそのものならば my(%REC); でいいですが、この場合RECはハッシュのリファレンスです。 例えばこんな例では、 #!/usr/local/bin/perl my $foo; $foo->{'a'} = 'b'; print "$foo\n"; print ref $foo; exit; これを実行すると、 HASH(0x5a6562a) HASH みたいに表示されます。 これでもわかるように$fooはハッシュのリファレンスです。 refはリファレンスが参照する型を返すのでHASHならばハッシュのリファレンスと言うことになります。 ちなみにリファレンスの型はスカラーです。 だからこの場合も my($REC); で構わないのです。
えと、こういうのをリファレンスといって、$REC の中にCでいうポインター情報を代入する方式です。 $REC{YEAR}= $rc->{'年度'}; だと、%REC そのものが1つの連想配列として働きますが、 $REC->{YEAR} = $rc->{'年度'}; だと、$REC 自身は配列としては動作しません。 「どこそこのメモリ上に連想配列がある」という情報だけが $REC に書き込まれるのです。