Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用转储程序对perl中的哈希进行排序_Perl_Sorting_Hash_Dump - Fatal编程技术网

使用转储程序对perl中的哈希进行排序

使用转储程序对perl中的哈希进行排序,perl,sorting,hash,dump,Perl,Sorting,Hash,Dump,我有一个散列如下: %hash = { car => { '10' => 'y', '11' => 'y', '12' => 'y', '13' => 'y' }, bus => { '10' => 'y', '11' => 'y', '12' => 'y', '13' => 'y'

我有一个散列如下:

%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'
    }
}
#!/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中打印此哈希(使用转储程序),其中每个部分的键按上述顺序排序(10、11、12、13、14…)

提前感谢,


Miki

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

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

您可以像下面这样手动对散列的键进行排序:

%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'
    }
}
#!/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}";
    }
}

请参见中的
Sortkeys
。您可以将其设置为对哈希键进行排序的子例程。

您可以尝试

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'
              }
    };

$Data::Dumper::Sortkeys

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


但是你会有多个相同密钥的条目,这是被禁止的。你说的“打印到数组中”是什么意思?您能显示预期结果吗?始终
使用strict;使用警告
然后您应该使用
my$hash={…}
my%hash=(…)
而不是
%hash={…}
。阅读以了解原因。抱歉-使用转储程序写入文件。谢谢,但有没有一种方法可以使用转储程序执行此操作?@Mike Sure。在转储之前,只需将
$Data::Dumper::Sortkeys
设置为true。