ハッシュのリファレンスを用いた処理
ActivePerl 5.8 , WinXP SP2の環境です。
Perl スクリプトを用い、ファイルから複数のブロックからなる情報をよみとり、個別のハッシュを作り、それをリファレンスの配列としてまとめて後から参照するという操作をしたいのですが、詰まってしまいました。。
例として読み取るファイルは
---input.txt---------
>1
Jan 1
Feb 4
>2
Mar 9
Apr 3
>3
Oct 8
Nov 4
------------------
ここから1,2,3の個別のハッシュ
{Jan => 1
Feb => 4}
{Mar=> 9
Apr =>3}
{Oct =>8
Nov =>4}
を作成し、それぞれのハッシュのリファレンスの配列をつくり、その後からすべてのハッシュの中身を個別に出力させたいと思いました。
次のようなスクリプトを作成したのですが思ったように作動しません。
use strict;
open (IN, "input.txt") or die ("cant open file \n");
my $reff;
my @array_of_reff;
my %hash;
my $count = 0;
while(<IN>){
my $line = $_;
######ここでは各ブロックの頭の ">"を認識し、2個目以降であれば直前までで作ったハッシュのリファレンス($reff)を配列@array_of_reffに入れる。
if($line =~ /^>/){
if($count >0){
$reff = \%hash ;
push (@array_of_reff, $reff);
%hash = ();
}
$count++;
}
########ここではアルファベットが入った行を認識して、ハッシュに追加しています
if($line =~ /^[A-Za-z]/){
$line =~ /([A-Za-z]+)\s+/;
my $month = $1;
$line =~ /\s+(\d+)/;
my $day= $1;
$hash{$month} = $day;
}
###ここはファイルの最後になったら直前まで作っていたハッシュののリファレンス($reff)を配列@array_of_reffに入れる。
if( eof ){
$reff = \%hash ;
push (@array_of_reff, $reff);
}
}
#####ハッシュのリファレンスの配列(@array_of_reff)からもとのハッシュを参照し、ハッシュごとに出力
foreach my $reff_of_hash (@array_of_reff){
print "output";
while( (my $key,my $value) = each %$reff_of_hash ){
print "\n" , $key, " : ", $value, ;
}
}
このスクリプトを実行すると
Nov 4
Oct 8
という3つめのハッシュのなかみが3回出力されてしまいます。自分では3つの別のハッシュをつくっているつもりでも、どうやら1種類しか作れていない、もしくはハッシュが上書きされているようなのですが、原因がわかりません。
この例だけ見るとハッシュのリファレンスを使う必要はないのですが、実際にはもうすこし大きいスクリプトで"ハッシュのリファレンスの配列を他のサブルーチンに渡す"ということを想定しており、これが解決できず先に進めない状態です。
アドバイス、解決法がわかったら教えていただけないでしょうか。
お礼
ありがとうございました。