• 締切済み

スカラーをハッシュのように扱えるのでしょうか

お世話になります。既存のプログラムを読んでいて下記のような 個所を見つけました。 ---------------------------------------------  ★この前に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->{'年度'}; とするのとはどのように違うのですか? よろしくお願いいたします。

みんなの回答

回答No.2

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); で構わないのです。

noname#25358
noname#25358
回答No.1

 えと、こういうのをリファレンスといって、$REC の中にCでいうポインター情報を代入する方式です。  $REC{YEAR}= $rc->{'年度'};  だと、%REC そのものが1つの連想配列として働きますが、  $REC->{YEAR} = $rc->{'年度'};  だと、$REC 自身は配列としては動作しません。  「どこそこのメモリ上に連想配列がある」という情報だけが $REC に書き込まれるのです。

関連するQ&A