電子書籍の厳選無料作品が豊富!

アクセス端末によって見え方を変えさせるため、条件節ifで =~ を使って分岐させているのですが、ユーザーエージェントがあまりにも多く、コードが長くなりすぎ制作に支障が出てきています
100%完璧に分岐させるところまでは求めていないため(アクセスの95%程度うまく分けられればいいかと思ってます)、たとえばスマホの場合はiPhoneとかAndroid、PCの場合はMSIEなど極力共通の部分を見つけてまとめてはいますが、それでも携帯、スマホ、PCと分けると非常に多くなり、
if(($ENV{'HTTP_USER_AGENT'} =~ /MSIE/) || ($ENV{'HTTP_USER_AGENT'} =~ /Firefox/)){}
など比較の片方は同じなのに同じことを何度も書く必要があり、非効率かつ強烈に長くなってしまい何とかまとめられないかと格闘しています

たとえば別で
$os_pc = "MSIE,Firefox";
$os_mb = "DoCoMo,KDDI";
など別でまとめて、
if($ENV{'HTTP_USER_AGENT'} =~ /$os_pcの,で分解したそれぞれの文字列と比較/){
PCと判定
}elsif($ENV{'HTTP_USER_AGENT'} =~ /$os_mbの,で分解したそれぞれの文字列と比較/){
携帯と判定
}
といったように、スマートに条件分岐させられないかと模索中ですが、=~ で別で用意したデータを,で分解してそれぞれと比べるとかできないでしょうか。

=~での比較ではなく、他の方法でもかまいませんので、ぜひお知恵をお貸しください。
よろしくお願いします。

A 回答 (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";

ハッシュで作った表だと、上から順に比較されるわけではないので、比較パターンとする文字列はユニークにしないといけません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
確かに表にしてforeachで比較すると別でまとめられてすっきりします。

ただ、「比較パターンとする文字列はユニークに」のユニークとはどういう意味でしょうか?
補足頂けますとありがたいです

お礼日時:2012/02/26 05:29

> ただ、「比較パターンとする文字列はユニークに」のユニークとは


> どういう意味でしょうか

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番目の比較が先に行われ、どちらも同じブラウザと判定されてしまうかもしれません。

これを避けるために、どんな順序で比較されてもよいよう、区別したいユーザエージェントだけに一致するようなパターンを指定する必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
「唯一無二」という意味でのユニークだったのですね、ありがとうございました
(ユニークという意味は人によって違う意味で使われますし、プログラミング用語の中での専門用語なのかなとも考えていて分かりませんでした)

確かに仰る通りハッシュはどの順番で格納されるか分からないので、ユーザーエージェントをまとめる時に問題になりますね
特にSafariで今悩んでます

ありがとうございました

お礼日時:2012/02/26 12:10

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2012/02/26 12:05

単純に正規表現をちゃんと使うのではダメなのですか?


if ($ENV{'HTTP_USER_AGENT'} =~ /(MSIE|Firefox)/) {
PCと判定
} elsif ($ENV{'HTTP_USER_AGENT'} =~ /(DoCoMo|KDDI/) {
携帯と判定
}
という具合で。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/02/26 05:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!