繁体   English   中英

如何使用Perl按子键/值对哈希的哈希排序?

[英]How do I sort hash of hashes by a sub key/value using perl?

我想排序以下哈希。 parentXX应该使用__displayorder的值进行排序,父项的Xtopic和主题的Xprod应该按字母顺序排序。

$VAR1 = {
   'views' => {
      'parent23' => {
          '__displayorder' => 2,
          'vtopic1' => {
              'gprod1.1' => undef,
              'aprod1.2' => undef,
          },
          'btopic2' => {
              'tprod2.1' => undef,
              'mprod2.2' => undef,
          },
      },
      'parent98' => {
          '__displayorder' => 1,
          'atopic1' => {
              'qprod1.1' => undef,
              'jprod1.2' => undef,
          },
          'xtopic2' => {
              'kprod2.1' => undef,
              'fprod2.2' => undef,
          }
      }
  }
}

您无法对哈希进行排序。 您可以按特定的顺序排列视图名称吗?

my $views = $VAR1->{views};
my @sorted_view_keys = sort {
        $views->{$a}{__displayorder} cmp $views->{$b}{__displayorder}
    } keys(%$views);

或者,也许您想要排序的视图?

my @sorted_views = map { $views->{$_} } @sorted_view_keys;
   -or-
my @sorted_views = @$views[@sorted_view_keys];

如前所述,您无法对常规Perl哈希进行排序。 Perl哈希是无序的。 但是您可以使用CPAN模块Tie::IxHash来获取有序哈希。 下面的Tie::IxHash样本输出中的所有子哈希转换为Tie::IxHash哈希并进行一些排序(例如,按字母顺序或按显示顺序):

 use Tie::IxHash;
 my $views = $VAR1->{views};
 while(my($view_key, $view) = each %$views) {
     while(my($topic, $prods) = each %$view) {
         next if $topic =~ m{^__};
         tie my %new_prods, 'Tie::IxHash', (map { ($_ => $prods->{$_}) } sort keys %$prods);
         $view->{$topic} = \%new_prods;
     }
     tie my %new_view, 'Tie::IxHash', (map { ($_ => $view->{$_}) } sort keys %$view);
     $views->{$view_key} = \%new_view;
 }
 tie my %new_views, 'Tie::IxHash', (map { ($_ => $views->{$_}) } sort { $views->{$a}->{__displayorder} <=> $views->{$b}->{__displayorder} } keys %$views);
 $VAR1->{views} = \%new_views;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM