我试图对HoAoH/Scalar进行排序,在开始时忽略标量条目,而只是根据键对子HASHes进行排序。
来自
$out = {
'bgp 65000' => [
' undo synchronization',
' graceful-restart',
' peer 192.1683.0.1 as-number 65000',
' #',
{
' ipv4-family vpn-instance client2' => [
' import-route direct route-policy BURrail'
]
},
'#'
{
' ipv4-family vpn-instance internet' => [
' default-route imported',
' import-route direct',
' import-route static'
]
},
' #',
{
' ipv4-family vpn-instance client1' => [
' import-route direct route-policy BURrail'
]
},
' #',
]
};
到
$out = {
'bgp 65000' => [
' undo synchronization',
' graceful-restart',
' peer 192.1683.0.1 as-number 65000',
' #',
{
' ipv4-family vpn-instance client1' => [
' import-route direct route-policy BURrail'
]
},
' #',
{
' ipv4-family vpn-instance client2' => [
' import-route direct route-policy BURrail'
]
},
'#'
{
' ipv4-family vpn-instance internet' => [
' default-route imported',
' import-route direct',
' import-route static'
]
},
' #',
]
};
我已经编写了对散列键进行排序的代码,但我想找到一种只对数据结构进行排序的方法。
use Sort::Naturally;
$key = ( sort keys %{ $out[0] } )[0];
foreach $key1 ( @{ $out[0]{$key} } ) {
if ( ref($key1) eq 'HASH' ) {
push @sorted, ( ( sort keys %{$key1} )[0] );
} else {
print "$key1\n";
}
}
foreach $key1 ( nsort(@sorted) ) {
print "$key1\n";
}
发布于 2014-01-02 19:15:37
很狡猾!(因为这太傻了。您应该使用更方便的数据结构。无论如何.)
首先,让我们忽略不相关的问题。我们想对数组的元素进行排序,所以让我们定位这个数组。
for my $array (values(%$out)) { ... }
按照同样的思路,让我们创建一个“视图”,它只包含我们想要排序的元素。下面给出了我们要排序的元素的索引:
my @idxs = grep { ref($array->[$_]) } 0..$#$array;
下面是我们要排序的“视图”(数组片):
@{$array}[ @idxs ]
这些元素中的每一个都是对散列的引用。我们希望自然地对所引用的散列中的唯一键进行排序。可以使用以下方法获得密钥:
( keys(%$_) )[0]
现在,我们只需要组装积木。
use Sort::Key::Natural qw( natkeysort );
for my $array (values(%$out)) {
my @idxs = grep { ref($array->[$_]) } 0..$#$array;
@{$array}[ @idxs ] =
natkeysort { (keys(%$_))[0] }
@{$array}[ @idxs ];
}
https://stackoverflow.com/questions/20889789
复制相似问题