使用Dumper对perl中的哈希散列进行排序

时间:2014-04-29 08:04:23

标签: perl sorting hash dump

我有像这样的散列哈希:

%hash = {
    car => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    },
    bus => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    },
    tr => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    }
}

如何在PERL中打印哈希散列(使用Dumper),其中每个部分的键按上述顺序排序(10,11,12,13,14 ...)?

提前致谢,

三木

3 个答案:

答案 0 :(得分:4)

请参阅Data::Dumper中的Sortkeys。您可以将其设置为对散列键进行排序的子例程。

答案 1 :(得分:4)

你可以尝试

use Data::Dumper;
local $Data::Dumper::Sortkeys = 1;
# using custom sort function
# local $Data::Dumper::Sortkeys = sub { [ sort keys %{+shift} ] };

print Dumper {
    car => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    },
    bus => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    },
    tr => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    }
}

输出

$VAR1 = {
      'bus' => {
                 '10' => 'y',
                 '11' => 'y',
                 '12' => 'y',
                 '13' => 'y'
               },
      'car' => {
                 '10' => 'y',
                 '11' => 'y',
                 '12' => 'y',
                 '13' => 'y'
               },
      'tr' => {
                '10' => 'y',
                '11' => 'y',
                '12' => 'y',
                '13' => 'y'
              }
    };

来自perldoc Data::Dumper

  

$ Data :: Dumper :: Sortkeys

     

可以设置为布尔值,以控制是否按排序顺序转储哈希键。真值将导致所有哈希的键以Perl的默认排序顺序转储。也可以设置为子例程引用,将为每个转储的哈希调用该引用。在这种情况下,Data :: Dumper将为每个哈希调用一次子例程,并将其传递给哈希的引用。子例程的目的是按照它们应该转储的顺序返回对将要转储的键数组的引用。使用此功能,您可以控制键的顺序以及实际使用的键。换句话说,此子例程充当过滤器,您可以通过该过滤器排除某些键被转储。默认值为0,表示散列键未排序。

答案 2 :(得分:2)

如果您希望按顺序输出哈希的键,则需要在打印之前对其进行排序。

如果要使用Data::Dumper转储哈希并希望其键按排序顺序转储,可以将$Data::Dumper::Sortkeys设置为true,然后正常转储。

您可以手动对哈希的键进行排序:

#!/usr/bin/perl

use strict;
use warnings;

use feature qw(switch say);

my $hash = {
    car => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    },
    bus => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    },
    tr => {
        '10' => 'y',
        '11' => 'y',
        '12' => 'y',
        '13' => 'y'
    }
};

foreach my $key0 (sort keys %$hash) {
    say "$key0";
    foreach my $key1 (sort { $a <=> $b } keys %{$hash->{$key0}}) {
        say "\t$key1 $hash->{$key0}->{$key1}";
    }
}

测试:

$ perl t.pl 
bus
    10 y
    11 y
    12 y
    13 y
car
    10 y
    11 y
    12 y
    13 y
tr
    10 y
    11 y
    12 y
    13 y