【问题标题】:Sort array of hashes in Perl by key按键排序 Perl 中的哈希数组
【发布时间】:2015-02-13 11:22:57
【问题描述】:

我这样定义一个哈希数组:

while (my $line = <PILEUP>) {
    if ($line =~ /INDEL/ and $line !~ /^#/) {
        chop $line;
        my @splitline = split(/\t/, $line);
        $hash2{$splitline[1]}{len} = length($splitline[4]);
        $hash2{$splitline[1]}{type} = "INDEL";
        push @{$hash1{$splitline[0]}}, %hash2;
    }
}

然后,我想按每个哈希的键对该数组进行排序:

for my $chr (keys %hash1) {
    my @sorted =  sort { $a->{ } <=> $b->{ } } @{%hash1{$chr}};
}

但是,不知道如何在此处继续。

【问题讨论】:

  • 你能举个例子吗?我不清楚您实际上要排序的内容。我认为您可能混淆了您的特殊排序变量$a$b,因为在对数组进行排序时,数组元素的值。
  • 数组里面有很多哈希。我只想通过键对数组的元素进行排序,这些元素是哈希。
  • 如果你的数组中有散列,你如何比较两个不同散列的“相等性”?

标签: arrays perl sorting hash


【解决方案1】:

我这样定义一个哈希数组:

不,你没有。你定义一个这样的数组哈希。

    chop $line;

chomp 几乎在所有情况下都是可取的。在 10 年的 Perl 编程中,我只使用过chop 作为一种好奇心。

    $hash2{$splitline[1]}{len} = length($splitline[4]);
    $hash2{$splitline[1]}{type} = "INDEL";
    push @{$hash1{$splitline[0]}}, %hash2;

在这里,您将%hash2 的键和值推送到%hash1 内的数组中。您可能想要推送哈希参考:\%hash2。但在这种情况下,您需要使其具有词法范围,否则它将多次推送相同的引用。

for my $chr (keys %hash1) {
    my @sorted =  sort { $a->{ } <=> $b->{ } } @{%hash1{$chr}};
}

这是正确的方向,只是您必须选择一个(或多个)哈希值进行排序。例如长度和类型。而且你不能使用循环。

my @sorted_keys = sort { $hash1{$a}{len}  <=> $hash1{$b}{len} ||
                         $hash1{$a}{type} cmp $hash1{$b}{type} } keys %hash1;

【讨论】:

  • 很好地解决了这个问题。这让我的大脑感到疼痛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2012-07-28
  • 1970-01-01
  • 2014-10-27
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多