perl写的QQ聊天记录统计程序

发布时间:2019-11-28编辑:脚本学堂
用perl实现的QQ聊天记录统计程序,不确定适用于最新的QQ工具,仅供大家学习perl语言参考之。
复制代码 代码如下:#!/user/perl
use strict;
use warnings;
use String:

用perl实现的QQ聊天记录统计程序,不确定适用于最新的QQ工具,仅供大家学习perl语言参考之。
 

复制代码 代码如下:

#!/user/perl
use strict;
use warnings;
use String::Multibyte;
my $gbk= String::Multibyte->new('GBK');
&stat( $ARGV[0] );
sub stat {
 open( FIN, shift );
 my %persons  = ();    #记录次数的哈希表
 my %num_name = ();    #保存昵称的哈希表
 my %wordcount=();   #保存字数的哈希表
 my $current_name='';
 while (<FIN>) {
  if ( $_ =~ m/^(d{4}-d{2}-d{2}s+d{2}:d{2}:d{2})(.*)((d+))$/ ) {
   $current_name=$3;
   if ( $persons{$3} ) {
    $persons{$3} = ++$persons{$3};
   }else {
   $persons{$3} = 1;
   }
   if ( not $num_name{$3} ) {
   $num_name{$3} = $2;
   }
  }elsif($current_name ne ''){
   chomp($_);
   if ( $wordcount{$current_name} ) {
    $wordcount{$current_name} += $gbk->length($_);
   }
   else {
    $wordcount{$current_name} = $gbk->length($_);
   }
  }
 }

 for ( &keys4value_sorted(%persons) ){
  printf "%-20s %-15s %-6s %-6sn", $num_name{$_},$_ , $persons{$_},$wordcount{$_};
 }
}

sub keys4value_sorted{#以数组返回通过值排序的hash的键集合。用的是选择排序
 my $ref_hash=shift;
 my @pairs=%$ref_hash;
 my $tmp;
 my $idx;
 for(my $i=1;$i<@pairs;$i+=2){
  $tmp=$pairs[$i];
  $idx=$i;
  for(my $j=$i+2;$j<@pairs;$j+=2){
   if($tmp<$pairs[$j]){
    $tmp=$pairs[$j];
    $idx=$j;
   }
  }

  if($tmp!=$pairs[$i]){
   $pairs[$idx]=$pairs[$i];
   $pairs[$i]=$tmp;
   $tmp=$pairs[$idx-1];
   $pairs[$idx-1]=$pairs[$i-1];
   $pairs[$i-1]=$tmp;  
  }
 }

 my @value_sorted_keys;
 for(my $i=0,my $j=0;$i<@pairs;$i+=2,$j++){
   $value_sorted_keys[$j]=$pairs[$i];
  }
 return @value_sorted_keys;
}

运行结果和之前用java实现的一样。不过感觉速度要快一点。^_^
其实上面程序中哈稀表按照值排序,完全可以用perl的内置函数sort来解决。
TMTOWTDI[Tim-today](There is more than one way to do it)。
这是perl的核心观点之一。
修改后程序如下(更短小精干了):
 

复制代码 代码如下:
#!/user/perl
use strict;
use warnings;
use String::Multibyte;
my $gbk= String::Multibyte->new('GBK');
$ARGV[0]||='c:3.txt';
&stat( $ARGV[0] );
sub stat {
 open( FIN, shift );
 my %persons  = ();    #记录次数的哈希表
 my %num_name = ();    #保存昵称的哈希表
 my %wordcount=();   #保存字数的哈希表
 my $current_name='';
 while (<FIN>) {
  if ( $_ =~ m/^(d{4}-d{2}-d{2}s+d{2}:d{2}:d{2})(.*)((d+))$/ ) {
   $current_name=$3;
   if ( $persons{$3} ) {
    $persons{$3} = ++$persons{$3};
   }else {
   $persons{$3} = 1;
   }
   if ( not $num_name{$3} ) {
   $num_name{$3} = $2;
   }
  }elsif($current_name ne ''){
   chomp($_);
   if ( $wordcount{$current_name} ) {
    $wordcount{$current_name} += $gbk->length($_);
   }
   else {
    $wordcount{$current_name} = $gbk->length($_);
   }
  }
 }
 for ( sort{ $persons{$b}<=>$persons{$a} } keys %persons ){
  printf "%-20s %-15s %-6s %-6sn", $num_name{$_},$_ , $persons{$_},$wordcount{$_};
 }
}