カウンタのログをもっとコンパクトにしたい

[上に] [前に] [次に]
匿名希望 [E-Mail] 1998/12/05(土) 06:01:04
wwwcount.cgi でログを取っているんですが、
$ENV{'HTTP_REFERER'} の値が
http://www3.airnet.ne.jp/hoge/hage/nph-abc.cgi?sample
の様に長いので、
nph-abc.cgi?sample
の様に短くしようと、
$target = hage;
$_ = $ENV{'HTTP_REFERER'};
if(($s=index($_, $target))>0){$_=substr($_, $s+length($target)+1);}
としたのですが、
$_ = (m|???$target???|g ); みたいに、もっとスマートにならないでしょうか。

それと、
$ENV{'HTTP_USER_AGENT'} の値も
Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Mozilla/4.04 [ja] (Macintosh; I; PPC, Nav)
Mozilla/4.06 [ja] (Win98; I)
の様に長いので、
iE4Windows98
NN4.04MacNav
NN4.06Win98
の様に短くしようとするのですが、
if(/MSIE 4.01/){$_ ='iE4';}
elsif(/MSIE 3.02/){$_ ='iE3';}
elsif(/4.06 [ja/){$_ ='NN4.06';}
elsif(/(Win95; I)/){$_ ='NN4';}
が精一杯です、これも何とかコンパクトにしたいんですが、
お知恵をお授けください。お願いします。

B-Cus 1998/12/05(土) 06:52:49
> $_ = (m|???$target???|g ); みたいに、もっとスマートにならないでしょうか。

s|http://www3\.airnet\.ne\.jp/hoge/hage/||;

> $ENV{'HTTP_USER_AGENT'} の値も

これは真面目に処理すると、結構ホネです。
ブラウザ名とOS名をわけて処理するのが吉かも。

$_= $ENV{'HTTP_USER_AGENT'};
if ( m|\(compatible MSIE ([\d\.]+)| ){
 $browser_name = "IE$1";
} elsif ( m|Mozilla/[\d\.]+| && m|Nav| ){
 $browser_name = "NN$1";
} elsif ( m|Mozilla/[\d\.]+| && ! m|Nav| ){
 $browser_name = "NC$1";
} elsif ( m|Lynx| ){
 $browser_name = "Lynx";
} else {
 $browser_name = "unknown";
}

if ( m|Windows 98| ){
 $os_name = "Windows98";
} elsif ( m|Windows 95| ){
 $os_name = "Windows95";
} elsif ( m|Windows NT| ){
 $os_name = "WindowsNT";
} elsif ( m|Win(dows)? ?32| ){
 $os_name = "Windows95/98/NT";
} elsif ( m|Win(dows)? ?16| ){
 $os_name = "Windows3.x";
} elsif ( m|Macintosh| ){
 $os_name = "Mac";
} elsif ( m|X11| ){
 $os_name = "UNIX";
} else {
 $os_name = "unknown";
}

$user_agent = "$browser_name $os_name";

繰り返しになりますが、これについて完璧な処理をしようとすると
ドツボにはまるでしょう。

B-Cus 1998/12/05(土) 07:10:03
m|Mozilla/[\d\.]+| は m|Mozilla/([\d\.]+)|の間違い。
さらに、elsif ( m|Mozilla/([\d\.]+)| && ! m|Nav| )は、
elsif ( m|Mozilla/([\d\.]+)| .* Nav| )じゃないと、$1に
代入されないかも(試してません)。

ま、いちおう雰囲気は伝わると思うので、いろいろやってみてください。

omi [E-Mail] 1998/12/05(土) 15:01:20
[[解決]]
も一つ教えてほしいんですが、
Nav は N.Navigator と思えますが、
Mozilla/4.5 [ja] は N.Communicator なんでしょうか?。

B-Cus さん ありがとうございます。

以下のような結果を出せるようになりました。
wwwcount.cgi は、カウントアップするかどうかを、
一日分のレコードの REMOTE_ADDR を見て判断するので
ファイルの文字数が約 3/4になれば(ちょぴり)早くなると思います。

--ログ-- ← -- $ENV{'HTTP_USER_AGENT'} ------
Nc4.5`w98←Mozilla/4.5 [ja] (Win98; I)
Nc4.5`wNT←Mozilla/4.5 [ja] (WinNT; I)
Nc4.06`w98←Mozilla/4.06 [ja] (Win98; I)
NN4.04`Mac←Mozilla/4.04 [ja] (Macintosh; I; PPC, Nav)
iE3.02`w95←Mozilla/2.0 (compatible; MSIE 3.02; Update a; Windows 95)
iE4.01`w98←Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)

教えてもらったのを、以下のように少し変えさせてもらいました。
$_=~ s|(.*)$target||;

if    ( m|MSIE ([\d\.]+)| ){ $browser_name = "iE$1";}
elsif ( m|Mozilla/([\d\.]+) .*Nav| ){ $browser_name = "NN$1";}
elsif ( m|Mozilla/([\d\.]+)..[ja]| ){ $browser_name = "NC$1";}
#elsif ( m|Lynx| ){ $browser_name = "Lynx"; }
else { $browser_name ='';}

if ( m|Win(dows )?98| ){ $os_name = "w98"; }
elsif ( m|Windows 95| ){ $os_name = "w95";}
elsif ( m|Macintosh| ){ $os_name = "Mac";}
elsif ( m|Win(dows )?NT| ){ $os_name = "wNT";}
#elsif ( m|Win(dows)? ?32| ){ $os_name = "w95/98/NT";}
#elsif ( m|Win(dows)? ?16| ){ $os_name = "w3.x";}
#elsif ( m|X11| ){ $os_name = "UNIX";}
else { $os_name ='';}

if ( $browser_name && $os_name ) {
 print "$browser_name`$os_name";
}
else { print $_;}

コメント行は、記載が多くなったときに合わせ込みます。
お世話になりました。<(_ _)>  あースッキリした。(^.^)

匿名希望になったのは、メールをコピーしたから、名前も書いた
つもりになってしまいました。三回目だわ。ピシー!~~~\(-_-)

B-Cus 1998/12/05(土) 18:40:46
> Nav は N.Navigator と思えますが、
> Mozilla/4.5 [ja] は N.Communicator なんでしょうか?。

Mozilla/4.xで、NavならNN。
Mozilla/4.xで、NavでなければNC。
Mozilla/[123]はNN。

でしょうか。

[上に] [前に] [次に]