• ベストアンサー

値の比較を効率よく行う方法を教えてください

最近、Perlによるプログラミングを始めました。 いろいろ学習していて不明なことがあったので、質問させていただきます。 比較による処理の分岐で、毎回比較する変数名と値は決まっています。 変数には、if文の外でforなどの処理により毎回違う値が格納されています。 このとき、何も考えずに力技で書けば if ($value eq 'aaa' || $value eq 'bbb' || $value eq 'ccc' || $value eq 'ddd' ||・・・){ # 処理 } となると思います。 これでも、処理はできるのですが、比較する値が少ないうちはいいですが、多くなったとき効率が悪いと思います。 それに、スマートではないですし・・・。 これを、効率よく処理なおかつスマートに書ける方法があれば、教えてやってください。 初心者の質問で申し訳ないですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

ハッシュテーブル(連想配列)を使用するのが最も良い方法です。 サンプルを以下に示します。 ---------------------------- $tbl{'aaa'} = 1; $tbl{'bbb'} = 1; $tbl{'ccc'} = 1; $tbl{'ddd'} = 1; $tbl{'eee'} = 2; $tbl{'fff'} = 2; $value = 'aaa'; if ($tbl{$value} == 1){ printf("1の処理\n"); } if ($tbl{$value} == 2){ printf("2の処理\n"); } ---------------------------- $valueに'aaa','bbb','ccc','ddd'の何れかの値が入っているとき、if ($tbl{$value} == 1)が成立します。 $valueに'eee','fff'の何れかの値が入っているとき、if ($tbl{$value} == 2)が成立します。 上記以外の値が入っているときは、上記の条件が成立しません。 $valueに'xxxxxx'等をいれて確かめて下さい。

qoozy257
質問者

お礼

ありがとうございます、レスが遅くなりました。 早速試したところ、コードもすっきりしてよくなりました。 まだまだ覚えることがたくさんありそうです。 ありがとうございました。

その他の回答 (2)

回答No.3

私だったら…ですが。 (1)比較する値が少ない(5個以下ぐらい?)だったら正規表現による一括チェックを使います。  BLUEPIXY様のパターン…ですが、例だと「文字列を含む」判定になってしまうような…やるならこうですかね?  if ($value =~/^aaa$|^bbb$|^ccc$|^ddd$/){   # 処理  } (2)比較する値が多かったらハッシュを使う。  tatsu99様の方法が良いと思います。 (3)比較対象の文字にハッシュの要素名として不適合な文字が入る可能性があるなら配列を使う方法もあります。  @checktable = ("aaa","bbb","ccc","ddd");  みたいにして比較対象を用意。  for文で一つずつ$valueと比較。  同じ物があったらフラグを立てるなりする。  

qoozy257
質問者

お礼

比較対象が今10個あるので、コードが長くなるのがいやだったため、よい方法をお伺いしました。 でも、いろいろな方法があることには改めてプログラミングの奥の深さを感じます。 これから、皆さんに教えていただいたものを一つ一つ確認しながら試してみます。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

if ($value =~ /aaa|bbb|ccc|ddd/o){ # 処理 } でどうでしょう、効率は、そんなに悪くはないと思いますが。

qoozy257
質問者

お礼

なるほど、こういうやり方もあるのですね・・・。 比較対象が、多くなったときはコードが長くなりそうですが、試してみます。 効率とコードの読みやすさのどちらをとるのかということになりますね。

関連するQ&A