使用此代码后,我陷入了我认为是一个简单的错误,但我需要外面的眼睛看看有什么问题。
我使用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} ";
答案 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";
}