#!/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;
}
2010年5月29日星期六
Perl : 复合条件的统计
百度知道的一个问题:http://zhidao.baidu.com/question/150963168.html
订阅:
博文评论 (Atom)
没有评论:
发表评论