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

Cra*_*igP 2 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);
Run Code Online (Sandbox Code Playgroud)

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

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

它按预期工作.

那么如何将我的Sortkeys子设置为仅对第一个哈希键进行排序?

mob*_*mob 6

回调用于$Data::Dumper::Sortkeys对数据结构中的任何哈希引用进行操作.所以你可以强化你的排序例程来对抗非数字输入,比如

$Data::Dumper::Sortkeys = sub {
    no warnings 'numeric';
    [ sort { $a <=> $b } keys %{$_[0]} ]
};
Run Code Online (Sandbox Code Playgroud)

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

$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]} ];
    }
};
Run Code Online (Sandbox Code Playgroud)