文章出處:http://hi.baidu.com/_wang8

對url中的路徑pathdir欄位按資料夾進行分割,對排序後的pathdir進行迴圈類比確定是否屬於統一範本。

其中針對每層路徑採用的是比較該層路徑字串的 最短編輯距離長度演算法 與當前層路徑的字串長度的比率(公式)。

 

針對同一範本,通過某個參數的值如SearchText或者CatId等來自動生成如下的url路徑:/search/SearchText
(\w+)/product.html? 、/search/CatId(\d+)/view.html?
這樣排序後的url的每層路徑每次變化會在一個範圍內。通過這個方法來自動識別這種情況下的應用範本

 

#!/usr/bin/perl

#cycle compare pathdir(url) to judgement is or same application model/demo

#http://hi.baidu.com/_wang8

#2011-4-20

use strict;

#use warnings;

#use Data::Dumper;

sub Main

 

if ((@ARGV == 1) && (-e $ARGV[0]))

 

my @arr_tmp = ();

 

open(TEST, "$ARGV[0]" ) or die "cannot open $ARGV[0]\n";

 

my $i = 0;

 

my $last_var = '';

 

my $mini = 0;

 

my $total = 0;

 

my $total2 = 0;

 

while(my $tmp = <TEST>)

 

chomp($tmp);

 

$tmp =~ s/^\s*//g;

 

$tmp =~ s/\s*$//g;

 

@arr_tmp = split(/\s+/, $tmp);

 

$tmp = $arr_tmp[1];

 

if ($tmp =~ /^\s*$/)

 

next;

 

($mini,$total,$total2)= &GetPathdir($last_var, $tmp);

 

$total = $total * $arr_tmp[0];

 

printf "%.2f\t%.2f", $total, $total2;

 

print "\t$arr_tmp[0]\t$last_var\t$tmp\t$mini\n";

 

$last_var = $tmp;

 

else

 

print "usage:perl apache_filterdomain_mini.pl log_file\n";

 

sub GetPathdir

 

my $str1 = shift;

 

my $str2 = shift;

 

my @arr_str1 = split('/', $str1);

 

my @arr_str2 = split('/', $str2);

 

my $i = 0;

 

my $res = '';

 

my $tmp = 0;

 

my $max = 0;

 

my $cent = 0;

 

my $total = 0;

 

my $total2 = 0;

 

if ($#arr_str1 eq $#arr_str2)

 

for ($i = 1; $i < $#arr_str1 +1; $i++)

 

$tmp = &GetMatrix($arr_str1[$i], $arr_str2[$i]);

 

#print "temp:$res\n";

 

$max = ($arr_str1[$i] <= $arr_str2[$i])? $arr_str2[$i]:$arr_str1[$i];

 

$cent = ($tmp/length($max)) * (100/$#arr_str1);

 

#print "cent:$tmp:$cent:$#arr_str1\n";

 

$total += $cent;

 

$res = "$res:$tmp";

 

$total2 = $tmp/length($max);

 

else

 

$res = ':';

 

return ($res, $total, $total2);

 

sub GetMatrix

 

my $str1 = shift;

 

my $str2 = shift;

 

my (@str1,@str2,@matrix);

 

@str1=split('',$str1);

 

@str2=split('',$str2);

 

my $str1_len=length($str1);

 

my $str2_len=length($str2);

 

my ($i,$j);

 

#print "str1_len:$str1_len:$str1\tstr2_len:$str2_len:$str2\n";

 

for($i=1;$i<=$str2_len;$i++)

 

$matrix[0][$i]=$str2[$i-1];

 

for($j=1;$j<=$str1_len+1;$j++)

 

$matrix[$j][0]=$str1[$j-1];

 

for($i=1;$i<=$str2_len;$i++)

 

$matrix[1][$i]=$i-1;

 

}

 

for($j=1;$j<=$str1_len;$j++)

 

if($j==1)

 

next;

 

else

 

$matrix[$j][1]=$j-1;

 

for($i=2;$i<=$str1_len;$i++)

 

for($j=2;$j<=$str2_len;$j++)

 

my ($left,$up,$nw);

 

$left=$matrix[$i][$j-1];

 

$up=$matrix[$i-1][$j];

 

$nw=$matrix[$i-1][$j-1];

 

if($matrix[$i][0] eq $matrix[0][$j])

 

my $tem=GetMini($left,$up,$nw);

 

$matrix[$i][$j]=$tem;

 

}

 

else

 

$matrix[$i][$j]=GetMini($left,$up,$nw)+1;

 

}

 

}

 

=pod

 

for($i=0;$i<=$str1_len;$i++)

 

for($j=0; $j<=$str2_len; $j++)

 

printf "$matrix[$i][$j]";

 

print"\n";

 

=cut

 

#print "mini:$matrix[$str1_len][$str2_len]\n";

 

return $matrix[$str1_len][$str2_len];

 

sub GetMini

 

my ($a,$b,$c)=@_;

 

$a=($a<=$b)?$a:$b;

 

$a=($a<=$c)?$a:$c;

 

return $a;

 

&Main;
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()