Perl 从散列中获取排序键

Perl 从散列中获取排序键,perl,hash,Perl,Hash,这是\%spec\u散列的数据转储程序。 它是按一个全国性的交换和符号分组的 foohost:~/walt $ vi /tmp/footoo $VAR1 = { 'ARCX' => { 'IACI' => 1, 'MCHP' => 1, }, 'AMXO' => {

这是\%spec\u散列的数据转储程序。 它是按一个全国性的交换和符号分组的

foohost:~/walt $ vi  /tmp/footoo
$VAR1 = {
          'ARCX' => {
                      'IACI' => 1,
                      'MCHP' => 1,
                    },
          'AMXO' => {
                      'YUM' => 1,
                      'SYK' => 1,
                    },
          'XISX' => {
                      'FCEL' => 1,
                      'GPS' => 1,
                    }
        };
我试图按键对这两个哈希进行排序,但不能。出于调试的目的,我真的很想看看这些散列得到了什么

foreach my $exch (sort keys %spec_hash) {
foreach my $exch (sort keys %{$spec_hash{$exch}}) {
如果我注释掉转储程序并尝试常规排序:

#print Dumper(\%spec_hash) ;

foreach my $exch (sort keys %spec_hash) {
#foreach my $exch (sort keys %{$spec_hash{$exch}}) {
    print "key: $exch, value: $spec_hash{$exch}\n"
    }
这就是我得到的:

key: AMXO, value: HASH(0x9cc88a4)
key: ARCX, value: HASH(0x9cd6f1c)
key: XISX, value: HASH(0x9cbd5f0)
试图打印这张照片根本不会打印任何东西:

foreach my $exch (sort keys %{$spec_hash{$exch}}) {
    print "key: $exch, value: $spec_hash{$exch}\n"
    }
默认情况下不会对其输出进行排序

尝试添加到脚本中

use strict;
use warnings;

use Data::Dumper;

my %hash = (
    'ARCX' => { 'IACI' => 1, 'MCHP' => 1, },
    'AMXO' => { 'YUM'  => 1, 'SYK'  => 1, },
    'XISX' => { 'FCEL' => 1, 'GPS'  => 1, },
);

print do {
    local $Data::Dumper::Sortkeys = 1;
    Dumper \%hash;
};
产出:

$VAR1 = {
          'AMXO' => {
                      'SYK' => 1,
                      'YUM' => 1
                    },
          'ARCX' => {
                      'IACI' => 1,
                      'MCHP' => 1
                    },
          'XISX' => {
                      'FCEL' => 1,
                      'GPS' => 1
                    }
        };

注意:如果我理解正确,可以修改它以包括您定义的排序子例程

for my $exch (sort keys %spec_hash) {
   for my $sym (sort keys %{ $spec_hash{$exch} }) {
      print "Exchange: $exch, Symbol: $sym\n";
   }
}

您想循环每个符号,但它们是按交换分组的,因此必须首先循环交换。

foreach my$exch排序键%spec_hash{…}有什么问题?编辑了上面的内容-它打印出一个十六进制值--key:AMXO,value:HASH0x9cc88a4-在上一条语句中,您使用了$exch两次,作为新迭代器和旧值。对于我的$exch排序键%{$spec_hash{$exch}}{这是有效的-我不知道为什么,也不知道你是怎么知道的。