根据键在 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_EXISTS
和 CHECK_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
模块(有几个类似的模块)来维护顺序哈希数据
我在 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_EXISTS
和 CHECK_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
模块(有几个类似的模块)来维护顺序哈希数据