#!/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)
没有评论:
发表评论