首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl排序HoAoH/Scalar

Perl排序HoAoH/Scalar
EN

Stack Overflow用户
提问于 2014-01-02 18:54:54
回答 1查看 214关注 0票数 0

我试图对HoAoH/Scalar进行排序,在开始时忽略标量条目,而只是根据键对子HASHes进行排序。

来自

代码语言:javascript
运行
复制
$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'
      ]
    },
    ' #',
  ]
};

代码语言:javascript
运行
复制
$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'
      ]
    },
    ' #',
  ]
};

我已经编写了对散列键进行排序的代码,但我想找到一种只对数据结构进行排序的方法。

代码语言:javascript
运行
复制
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";
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-02 19:15:37

很狡猾!(因为这太傻了。您应该使用更方便的数据结构。无论如何.)

首先,让我们忽略不相关的问题。我们想对数组的元素进行排序,所以让我们定位这个数组。

代码语言:javascript
运行
复制
for my $array (values(%$out)) { ... }

按照同样的思路,让我们创建一个“视图”,它只包含我们想要排序的元素。下面给出了我们要排序的元素的索引:

代码语言:javascript
运行
复制
my @idxs = grep { ref($array->[$_]) } 0..$#$array;

下面是我们要排序的“视图”(数组片):

代码语言:javascript
运行
复制
@{$array}[ @idxs ]

这些元素中的每一个都是对散列的引用。我们希望自然地对所引用的散列中的唯一键进行排序。可以使用以下方法获得密钥:

代码语言:javascript
运行
复制
( keys(%$_) )[0]

现在,我们只需要组装积木。

代码语言:javascript
运行
复制
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 ];
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20889789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档