在HoH的第一级密钥上的Perl Data :: Dumper数字排序

时间:2013-12-02 23:00:34

标签: perl

我有一个HoH数据结构。外层哈希的键是数字的 - 所以我想转储由第一个哈希键数字排序的HoH(不关心内部哈希的顺序)。我一直在尝试不同的Sortkeys潜艇...

use Data::Dumper;
#$Data::Dumper::Sortkeys = sub { [sort { $a <=> $b } (keys %{$_[0]})] };  ## A
 $Data::Dumper::Sortkeys = sub { [sort { $a <=> $b } keys %$_ ] };       ## B
print Dumper(\%dsCmdBlocks);

我似乎无法在Sortkeys子例程中找到正确的语法,该语法将以数字方式转储由第一个键排序的HoH。当我尝试“A”时,它对第一个键进行排序很好,但它也吐出错误消息,说内部参数不是数字(这是由于使用了[0]。所以“A”不是这是正确的方法。但我似乎无法在我的生活中弄清楚如何仅对第一个哈希进行排序。顺便说一下 - 当我使用这个通过正常的foreach循环发送HoH时:

foreach my $sk (sort {$a<=>$b} keys %dsCmdBlocks)
{
 print "KEY: $sk\n";
}

它按预期工作。

那么我怎样才能将我的Sortkeys子设置为仅对第一个哈希键进行排序?

1 个答案:

答案 0 :(得分:6)

$Data::Dumper::Sortkeys的回调对任何级别的数据结构中找到的每个哈希引用都有效。因此,您可以根据非数字输入强化排序例程,例如

$Data::Dumper::Sortkeys = sub {
    no warnings 'numeric';
    [ sort { $a <=> $b } keys %{$_[0]} ]
};

或应用其他一些阴谋来看看你的输入是什么样的

$Data::Dumper::Sortkeys = sub {
    my $data = join '', keys %{$_[0]};
    if ($data =~ /[A-Za-z]/) {   # for example
        # input is not numeric
        return [keys %{$_[0]}];
    } else {
        return [ sort { $a <=> $b } keys %{$_[0]} ];
    }
};