2010年5月29日星期六

Perl : 复合条件的统计

百度知道的一个问题:http://zhidao.baidu.com/question/150963168.html

#!/usr/bin/perl 
use strict;
use warnings;

my %flag_num=('myb'=>1,'erf'=>2,'abf'=>3,'dre'=>4,'myc'=>5,'bzip'=>6);
my $flag_count=6;

my %stat;
while(<>){
 my ($name,$flag) = split;
 my $num=$flag_num{$flag};
 $stat{$name}{$num}=1; 
}

my $subiter_array=make_subiter($flag_count);
my @data;
for my $r (@$subiter_array){
 my ($k, $keys_ref) = @$r;
 push @data,[$k,stat_step(\%stat,$keys_ref)];
}

my @sort_data=sort {
 length($a->[0]) <=> length($b->[0]) 
  or $a->[0] cmp $b->[0]
} @data;
print join(" ",@$_),"\n" for @sort_data;


sub make_subiter {
 my ($n) = @_;
 my @keys_iter;
 my $num=2**$n-1;
 for my $i (1..$num){
  my $j= sprintf("%b",$i);
  my @temp=reverse split("",$j);
  my @temp_key=map {$_+1} grep { $temp[$_] > 0 } (0..$#temp) ;
  my $key =join(":",@temp_key);
  push @keys_iter,[$key,\@temp_key];
 }
 return \@keys_iter; 
}


sub stat_step {
 my ($stat_ref,$keys_ref)=@_;
 my $keys_num=scalar(@$keys_ref);
 my $count=0;
 while(my ($name,$r)=each %$stat_ref){
  my $match = grep { exists $r->{$_} } @$keys_ref;
  $count++ if($match == $keys_num);
 }
 return $count;
}

没有评论:

发表评论