对哈希 Perl 的内部键哈希进行排序
Sorting internal keys hashes of hashes Perl
我正在尝试根据数字键对嵌套哈希进行排序。在下面的代码中,$keys(level one) 很容易排序,我试图找到一个关于对我的散列的 $position (second level) 进行排序的答案。请参考下面的 Data::Dumper 片段。
如果问题需要更多说明,请告诉我。
谢谢
my @array=();
foreach my $keys(sort({ $a <=> $b }keys %process)){
foreach my $position(sort({ $a <=> $b } keys %{$process{$keys}})){
foreach my $reference(keys %{$process{$keys}{$position}}){
my %min=();
my @arr1=();
while(my($allele,$frequency)=each %{$process{$keys}{$position}{$reference}}){
push(@arr1, "$keys\t$position\t$reference\t$allele\treference_val\t$frequency\n");
$min{1-$frequency}=1;
}
my $ref_min=(sort{$min{$b} <=> $min{$a}} keys %min)[0];
s/reference_val/$ref_min/g for @arr1;
push(@array,@arr1);
}
}
}
foreach(@array){
chomp;
print OUT $_,"\n";
}
Data::Dumper
$VAR1 = '1';
$VAR2 = {
'16977' => {
'G' => {
'A' => '0.0310014'
}
},
'77089' => {
'C' => {
'T' => '0.0171221'
}
},
'66442' => {
'T' => {
'A' => '0.0017295'
}
},
预期输出:
1 16977 G A 0.0310014
1 66442 C T 0.0171221
1 77089 T A 0.001
在我看来,您是按排序顺序遍历第二级哈希。我 运行 你的代码(修改后只转到 STDOUT):
use strict;
use warnings;
my %process = (
'1' => {
'16977' => {
'G' => {
'A' => '0.0310014'
}
},
'77089' => {
'C' => {
'T' => '0.0171221'
}
},
'66442' => {
'T' => {
'A' => '0.0017295'
}
},
},
);
my @array=();
foreach my $keys(sort({ $a <=> $b }keys %process)){
foreach my $position(sort({ $a <=> $b } keys %{$process{$keys}})){
foreach my $reference(keys %{$process{$keys}{$position}}){
my %min=();
my @arr1=();
while(my($allele,$frequency)=each %{$process{$keys}{$position}{$reference}}){
push(@arr1, "$keys\t$position\t$reference\t$allele\treference_val\t$frequency\n");
$min{1-$frequency}=1;
}
my $ref_min=(sort{$min{$b} <=> $min{$a}} keys %min)[0];
s/reference_val/$ref_min/g for @arr1;
push(@array,@arr1);
}
}
}
foreach(@array){
chomp;
print STDOUT $_,"\n";
}
并得到这个输出:
1 16977 G A 0.9689986 0.0310014
1 66442 T A 0.9982705 0.0017295
1 77089 C T 0.9828779 0.0171221
这与您的预期输出不同,因为它包含 $ref_min 值,并且前两列之后的列顺序不同(因为它们是根据位置排序的)。你想要什么不同的行为?
我正在尝试根据数字键对嵌套哈希进行排序。在下面的代码中,$keys(level one) 很容易排序,我试图找到一个关于对我的散列的 $position (second level) 进行排序的答案。请参考下面的 Data::Dumper 片段。
如果问题需要更多说明,请告诉我。
谢谢
my @array=();
foreach my $keys(sort({ $a <=> $b }keys %process)){
foreach my $position(sort({ $a <=> $b } keys %{$process{$keys}})){
foreach my $reference(keys %{$process{$keys}{$position}}){
my %min=();
my @arr1=();
while(my($allele,$frequency)=each %{$process{$keys}{$position}{$reference}}){
push(@arr1, "$keys\t$position\t$reference\t$allele\treference_val\t$frequency\n");
$min{1-$frequency}=1;
}
my $ref_min=(sort{$min{$b} <=> $min{$a}} keys %min)[0];
s/reference_val/$ref_min/g for @arr1;
push(@array,@arr1);
}
}
}
foreach(@array){
chomp;
print OUT $_,"\n";
}
Data::Dumper
$VAR1 = '1';
$VAR2 = {
'16977' => {
'G' => {
'A' => '0.0310014'
}
},
'77089' => {
'C' => {
'T' => '0.0171221'
}
},
'66442' => {
'T' => {
'A' => '0.0017295'
}
},
预期输出:
1 16977 G A 0.0310014
1 66442 C T 0.0171221
1 77089 T A 0.001
在我看来,您是按排序顺序遍历第二级哈希。我 运行 你的代码(修改后只转到 STDOUT):
use strict;
use warnings;
my %process = (
'1' => {
'16977' => {
'G' => {
'A' => '0.0310014'
}
},
'77089' => {
'C' => {
'T' => '0.0171221'
}
},
'66442' => {
'T' => {
'A' => '0.0017295'
}
},
},
);
my @array=();
foreach my $keys(sort({ $a <=> $b }keys %process)){
foreach my $position(sort({ $a <=> $b } keys %{$process{$keys}})){
foreach my $reference(keys %{$process{$keys}{$position}}){
my %min=();
my @arr1=();
while(my($allele,$frequency)=each %{$process{$keys}{$position}{$reference}}){
push(@arr1, "$keys\t$position\t$reference\t$allele\treference_val\t$frequency\n");
$min{1-$frequency}=1;
}
my $ref_min=(sort{$min{$b} <=> $min{$a}} keys %min)[0];
s/reference_val/$ref_min/g for @arr1;
push(@array,@arr1);
}
}
}
foreach(@array){
chomp;
print STDOUT $_,"\n";
}
并得到这个输出:
1 16977 G A 0.9689986 0.0310014
1 66442 T A 0.9982705 0.0017295
1 77089 C T 0.9828779 0.0171221
这与您的预期输出不同,因为它包含 $ref_min 值,并且前两列之后的列顺序不同(因为它们是根据位置排序的)。你想要什么不同的行为?