2012-09-13 58 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