用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的核心观点之一。
修改后程序如下(更短小精干了):