0

次のハッシュをソートしたいと思います。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,
          }
      }
  }
}
4

2 に答える 2

0

すでに述べたように、通常の Perl ハッシュをソートすることはできません。Perl ハッシュは順不同です。ただし、CPAN モジュール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;
于 2013-09-11T15:40:20.957 に答える