我有一个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子设置为仅对第一个哈希键进行排序?
回调用于$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)
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |