根据键在 Perl 中读取哈希

Read hashes in Perl based on keys

我在 Perl 中有一个散列,如下所示。有:

%typeMethodsMap = (
    CHECK_REP_EXISTS  => "1_abc",
    CHECK_JDK_VERSION  => "2_abc",
    CHECK_BLOCKS_FAILED  => "1_xyz",
    CHECK_OR_EXISTS => "2_xyz",
    CHECK_UPG_EXISTS => "3_xyz",
    CHECK_SSO_EXISTS => "4_xyz"
);

读取hash时,不是按定义读取key,而是随机读取。我需要根据键的升序格式通过哈希循环读取 运行,即 CHECK_BLOCKS_FAILED,然后是 CHECK_OR_EXISTS,然后是 CHECK_UPG_EXISTSCHECK_SSO_EXISTS的值分别为 "1_xyz""2_xyz""3_xyz""4_xyz"

请让我知道这里是否有人可以帮助我?

是的。按照设计,哈希键是随机顺序的。

这有很多原因 - perlsec and keys 中有介绍 - 但总而言之,如果您需要保留键顺序,则需要使用 sort

或者 slice:

my @order = qw ( first second third ); 

my %hash = ( second => 'a', third => 'b', first => 'c' );

print "@hash{@order}";

或:

foreach my $key ( @order ) {
    print "$key = $hash{$key}\n";
}

数组按数字明确排序。哈希是明确无序的(或随机顺序)。

如果您是自定义排序,那么您可以根据比较的值使用任何您喜欢的函数 returns -1、0 或 1。

cmp 对字符串执行此操作,<=> 对数字执行此操作。

自定义排序注意事项,可能是这样的:

use strict;
use warnings;

use Data::Dumper;

my %typeMethodsMap  = (
    CHECK_REP_EXISTS  => "1_abc",
    CHECK_JDK_VERSION  => "2_abc",
    CHECK_BLOCKS_FAILED  => "1_xyz",
    CHECK_OR_EXISTS => "2_xyz",
    CHECK_UPG_EXISTS => "3_xyz",
    CHECK_SSO_EXISTS => "4_xyz",
);

my @order = qw(
    CHECK_REP_EXISTS 
    CHECK_JDK_VERSION 
    CHECK_BLOCKS_FAILED  
    CHECK_OR_EXISTS 
    CHECK_UPG_EXISTS
    CHECK_SSO_EXISTS 
);

my $count = 0; 
my %magic_order = map { $_ => $count++ } @order;
print Dumper \%magic_order;

sub custom_sort { 
   return $magic_order{$a} <=> $magic_order{$b};
}

foreach my $key ( sort { custom_sort } keys %typeMethodsMap ) {
   print $key,"\n";
}

尽管请注意 - 这并没有提高多少效率,它只是为了说明 'custom sorting'。或者 - 如果您想根据正在排序的 'keys' 进行排序:

sub custom_sort {
    my ( $a_number, $a_text ) = split ('_',$a);
    my ( $b_number, $b_text ) = split ( '_', $b );

    if ( $a_number == $b_number ) {
       return $a_text cmp $b_text; 
    }
    else {
        return $a_number <=> $b_number
    }
}

这将首先按数字排序,然后再按字母顺序排序。 (如果你想要相反的话,交换 <=>cmp)。

如果你知道键是什么,那么你可以只写

for my $key (qw/ 1_CHECK_BLOCKS_FAILED 2_CHECK_OR_EXISTS 3_CHECK_UPG_EXISTS /) {
    ...
}

否则,您必须在构建散列时在单独的数组中跟踪键的顺序,或者使用类似 Tie::Hash::Indexed 模块(有几个类似的模块)来维护顺序哈希数据