2012-09-13 59 views
1

假設我有以下數據的Perl:多維散列

cluster1中:d(A)中,f(C)類,(A)

Cluster2中,R(d),H(d ),F(A)

我想這一點,把

產量:

cluster1:A->2 
    cluster1:C->1 
    cluster2:D->2 
    cluster2:A->1 

這裏是我的嘗試,但它是不正確的,那我想計算字符部分有我不能修復 代碼是非常大的代碼的一部分的問題,正是我想要的多維散列

use strict; 
use Data::Dumper; 
my %count; 
while (<DATA>) { 
    my %HoH; 
    my ($cluster, $ch) = split (/:/,$_); 
    $HoH{$cluster}={split /[()]+/,$ch}; 
    for my $clust (keys %HoH) { 
     for my $character (keys %{ $HoH{$clust} }) { 
      $count{$clust}{$HoH{$clust}{$character}}++; 
    } 
    } 
} 
print Dumper(\%count); 
foreach my $name (sort keys %count) { 
    foreach my $subject (keys %{$count{$name}}) { 
     print "$name:$subject->$count{$name}{$subject}\n"; 
    } 
} 

DATA

cluster1中:d(A)中,f(C)類,(A)

Cluster2中:R(d)中,h(d)中,f(A)

+0

而問題是什麼? – choroba

+0

問題更新 – shaq

+0

現在輸入格式也非常不同。 – flesk

回答

0

如果您嘗試瞭解下面的代碼,這樣就可以得到一個想法解決問題這將是不錯: -

use strict; 
    use Data::Dumper; 

    my $data = "cluster1:A,B,C,A"; 
    my %cluster =(); 

    my ($cluster_key, $cluster_val) = split (':', $data); 
    my @cluster1_data = split(',', $cluster_val); 


    foreach my $val (@cluster1_data) { 
    $cluster{$cluster_key}{$val}++; 
    } 
    print Dumper(\%cluster); 


    foreach my $clus (keys %cluster) { 
    my $clus_ref = $cluster{$clus}; 
     foreach my $clu (keys %{ $clus_ref }){ 
      my $count = $clus_ref->{$clu}; 
      print"$clus:$clu->$count\n"; 
     } 
    } 

輸出:

$VAR1 = { 
      'cluster1' => { 
          'A' => 2, 
          'C' => 1, 
          'B' => 1 
         } 
     }; 


cluster1:A->2 
cluster1:C->1 
cluster1:B->1 
+0

我編輯了我的問題,也是我的代碼,請你看看有什麼問題 – shaq

1

你期待什麼$count{$cluster}{$characters}+=1;準確嗎?

while (<DATA>) { 
    next unless /^(cluster\d+):(.+)/; 
    $count{$1}{$_}++ for split/,/, $2; 
} 

如果您還添加sort到第二foreach你會得到你想要的輸出:如果你希望得到期望的結果,你必須遍歷輸入數據來填充%count

編輯:這就解決了更新的輸入和要求的問題:

my %count; 

while (<DATA>) { 
    next unless /^(cluster\d+):(.+)/; 
    my $cluster = $1; 
    $count{$cluster}{$_}++ for $2 =~ /\((\w)\)/g; 
} 

for my $key (sort keys %count) { 
    for my $value (sort { 
     $count{$key}{$b} <=> $count{$key}{$a} 
        } keys %{$count{$key}}) { 
     print "$key:$value->$count{$key}{$value}\n"; 
    } 
} 
+1

@shaq:如果你感到困惑,請參考http://perldoc.perl.org/perldata.html#Special-Literals通過''的東西。 – simbabque

+0

不,我不會對數據感到困惑,但是我會想知道你是否可以更新代碼,假設我有$ cluster中的集羣事物和$字符中的字符,我應該寫什麼 – shaq

+0

@simbabque:好點。此外,如果您正在從文件句柄讀取數據,請將「DATA」替換爲文件句柄的名稱。哦,我只注意到字符沒有排序,所以我不確定排序後面的邏輯是什麼? – flesk