2

假设我有以下数据

集群1:d(A),f(C)s,(A)

集群2: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";
    }
}

数据

集群1:d(A),f(C)s,(A)

集群2:r(D),h(D),f(A)

4

2 回答 2

1

你期望$count{$cluster}{$characters}+=1;做什么?%count如果您希望获得所需的结果,则必须遍历输入数据以进行填充:

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

如果您还添加sort到第二个foreach,您将获得所需的输出。

编辑:这解决了更新输入和要求的问题:

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";
    }
}
于 2012-09-13T10:07:30.500 回答
1

如果您尝试理解以下代码,这样您就可以了解解决问题的想法,那就太好了:-

    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
于 2012-09-13T10:50:45.417 回答