- ベストアンサー
効率的な条件分岐の方法を探す
- アクセス端末によって見え方を変えさせるため、条件節ifで分岐させているが、コードが長くなりすぎて制作に支障が出ている。
- アクセスの95%程度うまく分けられれば良いため、共通の部分を見つけてまとめているが、それでも非効率かつ長くなってしまう。
- =~で別で用意したデータを,で分解してそれぞれと比べる方法などを模索中。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
端末タイプの表を作って繰り返しの中で判定してはどうでしょうか。 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"; ハッシュで作った表だと、上から順に比較されるわけではないので、比較パターンとする文字列はユニークにしないといけません。
その他の回答 (3)
- t-okura
- ベストアンサー率75% (253/335)
> ただ、「比較パターンとする文字列はユニークに」のユニークとは > どういう意味でしょうか 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番目の比較が先に行われ、どちらも同じブラウザと判定されてしまうかもしれません。 これを避けるために、どんな順序で比較されてもよいよう、区別したいユーザエージェントだけに一致するようなパターンを指定する必要があります。
お礼
回答ありがとうございます。 「唯一無二」という意味でのユニークだったのですね、ありがとうございました (ユニークという意味は人によって違う意味で使われますし、プログラミング用語の中での専門用語なのかなとも考えていて分かりませんでした) 確かに仰る通りハッシュはどの順番で格納されるか分からないので、ユーザーエージェントをまとめる時に問題になりますね 特にSafariで今悩んでます ありがとうございました
- Tacosan
- ベストアンサー率23% (3656/15482)
Tie::RegexpHash なんてのもあるみたい.
お礼
ありがとうございます。 CPAN読んでみたのですが、今ひとつ理解できず、他サイトのサンプルを探してみたのですが思うようなものが出てきませんでした。 また時間をかけてこのコードは勉強させて頂きます
- hanabutako
- ベストアンサー率54% (492/895)
単純に正規表現をちゃんと使うのではダメなのですか? if ($ENV{'HTTP_USER_AGENT'} =~ /(MSIE|Firefox)/) { PCと判定 } elsif ($ENV{'HTTP_USER_AGENT'} =~ /(DoCoMo|KDDI/) { 携帯と判定 } という具合で。
お礼
早速の回答ありがとうございます 確かに|ですれば少しスリムになりますが、それでもかなり比べるものが多いのであれこれ書き並べるとモニター上で何行にもなるため、できればMSIEとかKDDIとかといったものを別のところに一括してまとめて、この条件節のところではもっとシンプルにできないかと考えています。
お礼
回答ありがとうございます 確かに表にしてforeachで比較すると別でまとめられてすっきりします。 ただ、「比較パターンとする文字列はユニークに」のユニークとはどういう意味でしょうか? 補足頂けますとありがたいです