小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

動的にハッシュの配列を作成

動的にハッシュの配列

以下は、一行目に見出し項目行があり、2行目以降にデータがあるcsvデータを
標準入力から読み込んで見出し項目をハッシュキーにして行データを配列に格納します。

#!/usr/bin/perl -w
use strict;

# 変数宣言
my (@a, $i, $j, @item, @itemdata, %linedata);

# 変数初期化
@a=();
@item=();
@itemdata=();
%linedata=();

#標準入力から読み込み
while () {
  chomp();
  if ($#item == -1) {     #一行目の見出し項目行の処理
     @item = split(",");  #ハッシュのキー項目を取得
  }
  else {
     @itemdata = split(",");
     for $j (0 .. $#item) {
        $linedata{$item[$j]} = $itemdata[$j];  #ハッシュを作成
     }
     # 無名ハッシュを中括弧するとそのリファレンススカラー値を返す。
     push (@a, { %linedata });
  }
}

# ハッシュの配列を取り出す
for $i (0 .. $#a) {
    for $j (sort keys %{$a[$i]}) {
        print '$a[' . $i . ']{' . $j . '}=' . $a[$i]{$j} . ' ';
    }
    print "\n";
}

push (@a, { %linedata });の { %linedata }は、%linedataのリファレンスでなく、
%linedataが展開されたデータについての無名ハッシュのリファレンスになります。
ちなみに、%linedataのリファレンスは、\%linedataです。

また、ちなみにpush関数は、配列の最後の要素にデータを押し込む関数です。