按键在Perl中对哈希数组进行排序

时间:2015-02-13 11:22:57

标签: arrays perl sorting hash

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

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}};
}

但是,不知道如何继续这里。

1 个答案:

答案 0 :(得分:3)

  

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

不,你没有。您可以定义类似的数组哈希。

    chop $line;
几乎在每种情况下都优选{p> chomp。在Perl编程的10年中,我只使用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;