问一个相似度的算法问题

#/usr/bin/perl
use strict;
use Encode;
my $str="a我a是中国人";
my $str1="a我asadf";
print match_str($str,$str1)."\n";
sub match_str(){
my($strmin,$strmax)=@_;
my $i;
Encode::_utf8_on($strmin); #因为utf8的字符对比的话,一个汉字算三个字节,所以需要转化
Encode::_utf8_on($strmax);

        if(! length($strmax) >= length($strmin)){
        my      $strtmp=$strmax;
        my      $strmax=$strmin;
        my      $strmax=$strtmp;
        }
Encode::_utf8_off($strmax);
Encode::_utf8_off($strmin);
if($strmax=~ m/^$strmin/){
        return $strmin;
}else{
        Encode::_utf8_on($strmin);
        for($i=length($strmin);$i>0;$i--){
        my      $newstr=substr($strmin,0,$i);
                Encode::_utf8_off($newstr);
                if($strmax =~ m/^$newstr/){
                        return $newstr;
                        }#$newstr
                }#for
        }#else
return 0;
}#match_str

这个来对比二个之间的最大公共前缀.离我的目标还远,有可能前缀不一样,不管,先写出来.对比公共前缀,因为有很多个文件名要对比,看来还要写个别的.
我周6写了个字函数,写的很破很垃圾,希望被骂,不过请骂的人指出来什么地方不好,可以怎么样改进,但不要骂回去看看小骆驼在过来,论坛吗?都是大家交流一下.呵呵

经过二天的研究。结果出来了,希望高人多提意见,改进这个程式

#/usr/bin/perl -w

my @filelist;
my @keylist;
my $i;
my $j;
my $fname;

#读入目录列表,去掉不合适做文件名的部分
my $dir_name="/home/fukai/test";
opendir(DIR, $dir_name) || die "Can't open directory $dir_name";
while($fname= readdir(DIR)){
        $fname =~ s/\.\w+?$//g;
        $fname =~ s/\d+?//g;
        $fname =~ s/\]//g;
        $fname =~ s/\[//g;
$fname =~ s/\]//g;
        $fname =~ s/\[//g;
        push @filelist,$fname;
}
closedir DIR;

for($i=0;$i<$#filelist+1;$i++){
        for(my $j=1;$j<$#filelist+1;$j++){
                            next if ($i==$j);
                if(! max_mutual_str(@filelist[$i],@filelist[$j]) == 0 ){
                          push @keylist, max_mutual_str(@filelist[$i],@filelist[$j]);
                }#if
        }#for1
}#for

#得到二个文件名的公共字串
sub max_mutual_str($$) {
        my($min,$max) = @_;
        if (length($min)>length($max)) {
                ($min,$max) = ($max,$min);
        }
        my $len = length($min);
        foreach my $rest (0..$len-1) {
                foreach my $pos (0..$rest) {
                        my $str = substr($min,$pos,($len-$rest));
                        return $str if $max =~ /$str/;
                }
        }
        return undef;
}

#去掉数组中重复的结果
foreach $item (@keylist) {
unless ( $seen{$item} ) {
$seen{$item} = 1;
push(@uniq,$item);
}
}

print $_."\n" foreach @uniq;

测试结果
fukai@fukai-laptop:~/test$ ls -l
总用量 32
-rw-r--r-- 1 fukai fukai    0 2008-12-13 17:59 [20081201.CCTV3.快乐驿站].田连元.-.李元霸别传.01.李元霸出世.TVRip.X264.AAC.mkv
-rw-r--r-- 1 fukai fukai    0 2008-12-13 18:00 [20081202.CCTV3.快乐驿站].田连元.-.李元霸别传.02.金殿夺金牌.TVRip.X264.AAC.mkv
-rw-r--r-- 1 fukai fukai    0 2008-12-13 18:49 [20081202.CCTV3.快乐驿站].田连元.-.李元霸别传.03.金殿夺金牌.TVRip.X264.AAC.mkv
-rw-r--r-- 1 fukai fukai    0 2008-12-13 18:49 [20081202.CCTV3.快乐驿站].田连元.-.李元霸别传.04.金殿夺金牌.TVRip.X264.AAC.mkv
-rw-r--r-- 1 fukai fukai    0 2008-12-13 18:49 [20081202.CCTV3.快乐驿站].田连元.-.李元霸别传.05.金殿夺金牌.TVRip.X264.AAC.mkv
-rw-r--r-- 1 fukai fukai    0 2008-12-13 17:59 [200812.CCTV3.快乐驿站].田连元.-.李元霸别传.播出预告.TVRip.X264.AAC.mkv
drwxr-xr-x 2 fukai fukai 4096 2008-12-14 10:35 a.php
-rw-r--r-- 1 fukai fukai    0 2008-12-13 19:02 perl1.pl
-rw-r--r-- 1 fukai fukai 1328 2008-12-14 16:14 perl5.pl
-rw-r--r-- 1 fukai fukai 1338 2008-12-14 16:14 perl5.pl~
-rw-r--r-- 1 fukai fukai  255 2008-12-14 14:25 perl6.pl
-rw-r--r-- 1 fukai fukai    0 2008-12-13 21:10 perla
-rw-r--r-- 1 fukai fukai 1510 2008-12-13 21:12 perl.pl
-rw-r--r-- 1 fukai fukai  733 2008-12-13 22:44 p.pl
-rw-r--r-- 1 fukai fukai  712 2008-12-13 22:24 p.pl~
-rw-r--r-- 1 fukai fukai    4 2008-12-14 10:35 test.php

fukai@fukai-laptop:~/test$ perl perl5.pl
perl
p
e
perla
a
ppl~
pl~
CCTV快乐驿站田连元-李元霸别传李元霸出世TVRipXAAC
CCTV快乐驿站田连元-李元霸别传
CCTV快乐驿站田连元-李元霸别传
CCTV快乐驿站田连元-李元霸别传播出预告TVRipXAAC
CCTV快乐驿站田连元-李元霸别传金殿夺金牌TVRipXAAC
perlpl~
test
学习一下