2

次のデータがあるとします

cluster1:d(A)、f(C)s、(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";
    }
}

データ

cluster1:d(A)、f(C)s、(A)

cluster2:r(D)、h(D)、f(A)

4

2 に答える 2

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 に答える
1

あなたは正確に何をすることを期待$count{$cluster}{$characters}+=1;していますか?%count目的の結果が得られると予想される場合は、入力データをループして入力する必要があります。

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

sort2番目にも追加すると、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 に答える