• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数の比較( =~ )を効率よくまとめたい)

効率的な条件分岐の方法を探す

このQ&Aのポイント
  • アクセス端末によって見え方を変えさせるため、条件節ifで分岐させているが、コードが長くなりすぎて制作に支障が出ている。
  • アクセスの95%程度うまく分けられれば良いため、共通の部分を見つけてまとめているが、それでも非効率かつ長くなってしまう。
  • =~で別で用意したデータを,で分解してそれぞれと比べる方法などを模索中。

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

端末タイプの表を作って繰り返しの中で判定してはどうでしょうか。 use strict; use warnings; use Encode; use utf8; my %agent_type = ( qr/msie/i => 'pc', qr/firefox/i => 'pc', qr/docomo/i => '携帯', qr/kddi/i => '携帯', ); my $ua = $ENV{'HTTP_USER_AGENT'}; my $ua_type = "その他"; foreach my $key ( keys %agent_type ) { if ( $ua =~ $key ) { $ua_type = $agent_type{$key}; last; } } print Encode::encode( 'utf8', $ua_type ), "\n"; ハッシュで作った表だと、上から順に比較されるわけではないので、比較パターンとする文字列はユニークにしないといけません。

choei
質問者

お礼

回答ありがとうございます 確かに表にしてforeachで比較すると別でまとめられてすっきりします。 ただ、「比較パターンとする文字列はユニークに」のユニークとはどういう意味でしょうか? 補足頂けますとありがたいです

その他の回答 (3)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.4

> ただ、「比較パターンとする文字列はユニークに」のユニークとは > どういう意味でしょうか Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1 Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 のようなユーザエージェントがあるとき、 if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/) { } elsif ($ENV{'HTTP_USER_AGENT'} =~ /Mozilla/) { } ... のようにするときは、比較順序が決まっているので Firefox が最初の条件に一致することはありません。 しかし、keys で取り出したハッシュのキーはどういう順序になるかわからないため、上の例の2番目の比較が先に行われ、どちらも同じブラウザと判定されてしまうかもしれません。 これを避けるために、どんな順序で比較されてもよいよう、区別したいユーザエージェントだけに一致するようなパターンを指定する必要があります。

choei
質問者

お礼

回答ありがとうございます。 「唯一無二」という意味でのユニークだったのですね、ありがとうございました (ユニークという意味は人によって違う意味で使われますし、プログラミング用語の中での専門用語なのかなとも考えていて分かりませんでした) 確かに仰る通りハッシュはどの順番で格納されるか分からないので、ユーザーエージェントをまとめる時に問題になりますね 特にSafariで今悩んでます ありがとうございました

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

Tie::RegexpHash なんてのもあるみたい.

choei
質問者

お礼

ありがとうございます。 CPAN読んでみたのですが、今ひとつ理解できず、他サイトのサンプルを探してみたのですが思うようなものが出てきませんでした。 また時間をかけてこのコードは勉強させて頂きます

回答No.1

単純に正規表現をちゃんと使うのではダメなのですか? if ($ENV{'HTTP_USER_AGENT'} =~ /(MSIE|Firefox)/) { PCと判定 } elsif ($ENV{'HTTP_USER_AGENT'} =~ /(DoCoMo|KDDI/) { 携帯と判定 } という具合で。

choei
質問者

お礼

早速の回答ありがとうございます 確かに|ですれば少しスリムになりますが、それでもかなり比べるものが多いのであれこれ書き並べるとモニター上で何行にもなるため、できればMSIEとかKDDIとかといったものを別のところに一括してまとめて、この条件節のところではもっとシンプルにできないかと考えています。

関連するQ&A