2014年2月11日火曜日

[Perl] ハッシュ使用時に、キーの設定順を保持する方法

Perlのハッシュ(連想配列)は便利で良く使うのですが、
キーの設定順を保持してないので、例えば以下のコードを
実行すると、

#!/usr/bin/perl
my %tmp = ();
for (my $i=0; $i<100; $i++) {
  $tmp{$i} = $i+1;
}
foreach my $key (keys %tmp) {
  print "$key, $tmp{$key}\n";
}
exit;

■出力

6, 7
3, 4
7, 8
9, 10
2, 3
8, 9
1, 2
4, 5
0, 1

5, 6

と、バラバラな順序になってしまいます。
なのでメモリの無駄だなーとは思いつつ、キーだけ格納する
配列を別途用意したりしてましたが、そんなことをしなくても
良い方法があることを知りました。

それはTie::IxHashモジュールを使う方法です。
残念ながらMacのPerl v5.16.2環境では標準で入ってなかった
のですが、以下のコマンドでインストールできます。
sudo cpan
install Tie::IxHash

で、以下のようなコードで実行すると、

#!/usr/bin/perl
use Tie::IxHash;
my %tmp = ();
tie %tmp, 'Tie::IxHash';
for (my $i=0; $i<10; $i++) {
  $tmp{$i} = $i+1;
}
foreach my $key (keys %tmp) {
  print "$key, $tmp{$key}\n";
}
exit;

■出力
0, 1
1, 2
2, 3
3, 4
4, 5
5, 6
6, 7
7, 8
8, 9

9, 10

と、格納順で出力できます。

モジュールを追加しないといけないので、場合によっては
使えないかもしれませんが、なかなか良さげですね。

0 件のコメント: