数组内部的简单变量计数

时间:2014-04-13 23:17:20

标签: perl hash count

使用此代码后,我陷入了我认为是一个简单的错误,但我需要外面的眼睛看看有什么问题。

我使用unpack函数将数组划分为以下内容。

@extract = 

------MMMMMMMMMMMMMMMMMMMMMMMMMM-M-MMMMMMMM  
------SSSSSSSSSSSSSSSSSSSSSSSSSS-S-SSSSSDTA
------TIIIIIIIIIIIIITIIIVVIIIIII-I-IIIIITTT  

显然,在解压缩到数组后,当我尝试进入while循环时,@ extra显示完全为空。知道为什么会这样吗?     print @extract; #< -----------打印输入

my $sum = 0;
my %counter = ();
while (my $column = @extract) {
print @extract; #<------- This extract is completely empty. Should be input

for (my $aa = (split ('', $column))){
    $counter{$aa}++;
    delete $counter{'-'}; # Don't count -
    }

    # Sort keys by count descending  

    my @keys = (sort {$counter{$b} <=> $counter{$a}} keys %counter) [0]; #gives highest letter
    for my $key (@keys) {
        $sum += $counter{$key};
        print OUTPUT "$key   $counter{$key}   ";

2 个答案:

答案 0 :(得分:1)

每一行是一个数组元素是否正确?我在您的代码中没有看到您在检查各个字符的位置。

假设您显示的输入是一个包含该行为字符串的3元素数组:

#!/usr/bin/perl

use strict;
use warnings;

my @entries;

while(my $line = shift(@extract)){
    my %hash;
    for my $char(split('', $line)){
        if($char =~ /[a-zA-Z]/) { $hash{$char}++ }
    }

    my $high;
    for my $key (keys %hash) { 
        if(!defined($high)){ $high = $key }
        elsif($hash{$high} < $hash{$key}){ 
            $high = $key
        }
    }

    push @entries, {$high => $hash{$high}};
}

请注意,这会清空@extract,如果您不想这样做,则必须使用如下所示的for循环

for my $i (0 .. $#extract){
    #my %hash etc...
}

编辑: 改变了它,以便只保留最高的数字

答案 1 :(得分:0)

使用List :: Util中的reduce的方法。

#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'reduce';

my @extract = qw/
------MMMMMMMMMMMMMMMMMMMMMMMMMM-M-MMMMMMMM
------SSSSSSSSSSSSSSSSSSSSSSSSSS-S-SSSSSDTA
------TIIIIIIIIIIIIITIIIVVIIIIII-I-IIIIITTT
/;


for (@extract) {
    my %count;
    tr/a-zA-Z//cd;
    for (split //) {
        $count{$_}++;   
    }
    my $max = reduce { $count{$a} > $count{$b} ? $a : $b } keys %count;
    print "$max $count{$max}\n";
}