|
发表于 2014-5-31 01:58:06
|
显示全部楼层
- #!/usr/local/bin/perl
- use strict;
- use warnings;
- my$infile=shift;
- my$outfile=shift;
- $infile = 'Score_In.txt' unless $infile;
- $outfile = 'Score_Out.txt' unless $outfile;
- my@data=();
- open INFILE, "<$infile" or die "读取文件[$infile]错误: $!";
- my$title = <INFILE>;
- while(<INFILE>) {
- next unless /^\t\t(.*)/;
- my%row=(zf => 0, txt => $1);
- my@cs = split /\t/, $1;
- my($i,$fx) = (0,0);
- foreach (@cs) {
- next unless $_;
- if($i > 1) {
- if($i < 8) {
- $row{zf} += $_;
- } elsif($i < 12) {
- $row{zf} += 0.5*$_;
- } elsif(uc($_) eq 'A' or uc($_) eq 'B') {
- $fx += (ord('C') - ord(uc($_))) * 5;
- }
- }
- $i++;
- }
- $row{zf} += $fx>20?20:$fx;
- push @data, \%row;
- }
- close INFILE;
- my@sdata = sort { $b->{zf} <=> $a->{zf} } @data;
- my($zf,$no) = (10000,0);
- open OUTFILE, ">$outfile" or die "打开输出文件[$outfile]错误: $!";
- print OUTFILE $title;
- foreach my$ptr(@sdata) {
- $no++,$zf=$ptr->{zf} if $zf > $ptr->{zf};
- print OUTFILE "$no\t",sprintf("%.1f",$ptr->{zf}),"\t$ptr->{txt}\n";
- }
- close OUTFILE;
复制代码 用Perl简单很多,思路一样,不同的语言相同的行数信息量完全不一样,不应该追求最小行数,而应该精炼算法。 |
|