ブログが続かないわけ

この日記のはてなブックマーク数
Webエンジニアが思うこと by junichiro on Facebook

[Perl]Regexp::Assemble を使って連想配列のキーに正規表現を使う

このエントリーを含むはてなブックマーク hateb
連想配列のキーに正規表現を使いたくなることってあるじゃない。
my @strings = qw/
カナダ
インド
イギリス
ニッポン
ルーマニア
チュウゴク
イタリア
スペイン
ウクライナ
アルゼンチン
アメリカ
/;
こんな配列があるとする。これをア行、カ行...などにグループ分けして、例えば次のような出力を得たい場合を例にしてみよう。
カ行: カナダ
ア行: インド
ア行: イギリス
ナ行: ニッポン
ラ行: ルーマニア
タ行: チュウゴク
ア行: イタリア
サ行: スペイン
ア行: ウクライナ
ア行: アルゼンチン
ア行: アメリカ

一番すぐ思いつきそうなのが次のコードかもしれない。
for my $str (@strings) {
print &grouping($str), ": $str¥n";
}

sub grouping {
return 'ア行' if(m/^[ア-オ]/);
return 'カ行' if(m/^[カ-コ]/);
return 'サ行' if(m/^[サ-ソ]/);
return 'タ行' if(m/^[タ-ト]/);
return 'ナ行' if(m/^[ナ-ノ]/);
return 'ハ行' if(m/^[ハ-ホ]/);
return 'マ行' if(m/^[マ-モ]/);
return 'ヤ行' if(m/^[ヤ-ヨ]/);
return 'ラ行' if(m/^[ラ-ロ]/);
return 'ワ行' if(m/^[ワ-ン]/);
}
これでももちろん問題ない。if で分岐させるのがあまり好きでない方は、これを連想配列で処理したいと考えるかもしれない。その場合、まず、それぞれの行にマッピングするために、正規表現をキーとした、下記のような連想配列を用意する必要がある。
my %map = (
qr/^[ア-オ]/ => 'ア行',
qr/^[カ-コ]/ => 'カ行',
qr/^[サ-ソ]/ => 'サ行',
qr/^[タ-ト]/ => 'タ行',
qr/^[ナ-ノ]/ => 'ナ行',
qr/^[ハ-ホ]/ => 'ハ行',
qr/^[マ-モ]/ => 'マ行',
qr/^[ヤ-ヨ]/ => 'ヤ行',
qr/^[ラ-ロ]/ => 'ラ行',
qr/^[ワ-ン]/ => 'ワ行',
);

もちろん、このままでは例えば $map{カナダ} としてもカ行が返されるわけではない。そのため、連想配列のキーにあたる正規表現にマッチするかをチェックして、マッチしたらその値を返すというような処理が必要になる。例えば、下記のようなコードになるだろうか。
STR: for my $str (@strings) {
for my $regexp (keys %map) {
$str =~ $regexp and print $map{$regexp} and next STR;
}
}

ここで、Regexp::Assemble を使うと、もっと直感的な書き方ができる。
my $re = Regexp::Assemble->new->track->add(keys %map);
for my $str (@strings) {
$re->match($str) and print $map{$re->matched}, ": $str¥n";
}

この例では、Regexp::Assemble の良さがあまり伝わらないかもしれないが、ディスパッチテーブル等を使って、連想配列の値にコードリファレンスを持つような場合、その連想配列のキーを正規表現でも記述できるというのは、結構便利かもしれない。

詳細はPERL HACKS に載ってるので、興味のある方はご覧下さい。
chromatic, Damian Conway, Curtis "Ovid" Poe, 株式会社ロングテール/長尾 高弘 ¥ 3,150
Perl Hacker になるための一冊
アイディア本

この記事のトラックバックURL
http://en.yummy.stripper.jp/trackback/1246389
トラックバック
Pythonで辞書のキーに正規表現を使いたいという話
配列や連想配列をディスパッチテーブルとして利用していると、キーに正規表現を使いたくなる事があります。perlだと既にRegexp::Assembleというモジュールを使う方法が書かれていますが、僕はpythonで書きたい訳です。 アプローチは色々ありますが、僕はあくまでディス
| taichino.com | 2010/02/12 7:30 PM |
コメント









関連情報