我有一个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子设置为仅对第一个哈希键进行排序?
答案 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]} ];
}
};