2008年8月30日土曜日

リスト中のどれかがあれば真

久々にコーディング再開です。
いや、楽しいね!コーディング!(期限がなければ)
人様が作ったシステム(MTOS)上のプラグインを作っていますが、
人様が作ったので当然よくわからない部分がある。
ぐーぐる先生で先駆者の役立ちそうなよさげデータを
うまく拾えなかったりするもので、
やりたいことがうまくできない(半分以上私のスキル不足だ)けど、
この駄々っ子ぶりがいいよね!(仕事じゃなければ)
# まぁソース嫁ってのは当然なんですが、
# そこまでコストかけたくないので、うまくできないかなぁ
# 思うんですがなかなかうまくまとまってくれていませんね。
# 今のところうまいこと動いてるのでまぁいいか的な流れですが(笑)
というわけで、Perlでモガモガやっているんですが、
マッチングのところで、ちょっと悩んでいるというか、
世の中のPerl使いはどうやってんだろうって気になることがあったりします。
マッチング?な話なんですが、具体例で話すと、
あるテキストデータの、配列に格納されたキーワード群へのマッチング

という場合の処理って皆さんどうやってるのかなぁ。
実際にソースで考えると次のような感じ。
my @keyItem = ("Mon", "Tue", "Wed", "Thu", "Fri");
my $str = "私はThuに東京さいくだ。\n";
foreach (@keyItem) {
# 条件にマッチングしている
if ( $str =~ /$_/ ) {
# 処理ざます
last; # 抜け出すザマス
}
}
ってな具合に考えた。
ちなみに、
$str =~ /Mon|Tue|Wed|Thu|Fri/

で考えればよいって話もあるけど、
それだと@keyItemの中身が変化しちゃうと対応できないので、
狙いからそれちゃう。
こういうケースって結構あると思うんだけど、
みんなどうやって処理してるんだろう?
もっと美しいっ方法ってのがありそうだけど。

2 件のコメント:

  1. >それだと@keyItemの中身が変化しちゃうと対応できないので、狙いからそれちゃう。
    うーん。こういう風ではいかんの?
    sub build_regex {
    #実際は要エスケープ
    join("|",@_);
    }
    my $re = build_regex(@keyItem);
    print $re;
    if ($str =~ /${re}/) {
    print "hogehoge\n";
    }
    foreachだと毎度正規表現コンパイルしそうだしね。
    #そうか、Perlには正規表現オブジェクトみたいなのはないのね。

    返信削除
  2. OH!!!
    joinの存在ワスレテタヨ。
    一応、配列の中身をくっつけて正規表現をつくるってのは考えてたけど、
    # でもjoinは思い浮かばず(日ごろつかってないのばれてますね)
    それとfor/foreach文でまわしちゃうのと
    ・どっちがコスト安いのかな?
    ・どっちが可読性高いかな
    ってこと考えてたらアレしてしまった、。
    まぁそこまで深刻じゃないのでとりあえず動けばいいってのが
    もっともなのかもしれないけど。

    返信削除