2010-12-23 75 views
5

我正在尝试创建一个程序来计算数据文件的列中出现的不同值。因此,它会像,如果列的可能值是A,B,C的输出是一样的东西在Perl中,如何按值的频率进行排序?

A 456 
B 234 
C 344 

我一直能得到A,B和C的运行计数容易通过做这样的事情

my %count; 
for my $f (@ffile) { 

    open F, $f || die "Cannot open $f: $!"; 

    while (<F>) { 
     chomp; 
     my @U = split//; 

     $count{$U[2]}++; 
    } 

} 
    foreach my $w (sort keys %count) { 
     printf $w\t$count{$w}; 
    } 

例如在这里,我正在计算文件的第二列给出的路径。

如何通过计数输出中的printf的排序,而不是键(或值A,B,C)来获得 -

A 456 
C 344 
B 234 
+4

[perldoc -f printf](http://perldoc.perl.org/functions/printf.html):当一个简单的“`print”“时,不要陷入使用”`printf`“的陷阱会做。 “`print`”更高效且不易出错。 – 2010-12-23 15:28:44

回答

3
for my $w (sort {$count{$b} <=> $count{$a}} keys %count) { 
    print "$w\t$count{$w}\n"; 
} 
+0

呵呵,我很习惯C#,我忘了如何在Perl中进行排序! – tster 2010-12-23 15:26:55

8

这是一个常见问题:

perldoc -q sort

use warnings; 
use strict; 

my %count = (
    A => 456, 
    B => 234, 
    C => 344 
); 

for my $w (sort { $count{$b} <=> $count{$a} } keys %count) { 
    print "$w\t$count{$w}\n"; 
} 

__END__ 
A  456 
C  344 
B  234 
2

一些补充意见:

的输出是一样的东西......做这样的事情

您帮助我们来帮助你,如果你粘贴您的实际代码,简称如果可能的话。 当人们重新创建他们的实际代码时,他们经常会模糊或忽略他们问题的根源。

chomp; 
    my @U = split//; 

这会在空格字符上分割并在第二个空格之后寻找计数;它往往更容易做:

my @U = split ' '; 

split以恒定的空间,而不是一个正则表达式拆分上空白的任何序列中,像split /\s+/但它忽略尾随空白......这是一个常见足够的事情做,有这个特殊的语法。请注意,chomp变得不必要。

相关问题