2014-04-13 65 views
1

使用此代碼後,我被卡在我認爲是一個簡單的錯誤,但我需要外部的眼睛,看看有什麼不對。陣列中的簡單變量數

我用解壓函數將一個數組分成下列幾部分。

@extract = 

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

顯然,在解包入數組後,當我嘗試進入while循環時,@extract顯示完全爲空。任何想法爲什麼會發生這種情況? 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

開始寫代碼,獲取了一條線的最高數;然後在你的線上繞一圈;你似乎混淆了這裏的兩項任務。 – ysth

+0

你是對的,必須添加另一個循環元素來計算個體。謝謝 – Gyler

回答

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... 
} 

編輯: 改變它,這樣只有最高數量實際上保持

+0

謝謝Gabs00,會盡快嘗試。欣賞時間和精力。 – Gyler

+0

您不必在'for'中使用數組索引,您可以使用'for $ line(@extract)'。 – TLP

+0

@TLP,這對我來說是正確的,因爲我通常需要知道索引。 – Gabs00

0

使用從列表減少::的Util的一種方法。

#!/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"; 
}