【问题标题】:Perl: multidimensional hashPerl:多维哈希
【发布时间】:2012-09-06 09:05:09
【问题描述】:

假设我有以下数据

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)

【问题讨论】:

  • 现在输入格式也大不一样了。
  • @flesk: 是的,我应该从一开始就写好所有东西,现在这段代码有一个小错误

标签: perl hash multidimensional-array


【解决方案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

【讨论】:

  • 我已经编辑了我的问题和我的代码,请你看看有什么问题
【解决方案2】:

您希望$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";
    }
}

【讨论】:

  • @shaq:如果您对&lt;DATA&gt; 感到困惑,请参考perldoc.perl.org/perldata.html#Special-Literals
  • 不,我没有被数据弄糊涂,但我想知道你是否可以更新代码,假设我在 $cluster 中有集群的东西,在 $character 后面有字符我应该写什么
  • @simbabque:说得好。此外,如果您从文件句柄中读取数据,请将DATA 替换为文件句柄的名称。哦,我刚刚注意到字符没有排序,所以我不确定排序背后的逻辑是什么?
  • @shaq:你可以写$count{$cluster}{$_}++ for split/,/, $characters;来实现。
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 2014-05-27
  • 2011-12-10
  • 2011-04-11
  • 2013-12-04
  • 2018-02-25
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多