在Perl中基于键读取哈希
我有一个Perl哈希,如下所示。有:在Perl中基于键读取哈希,perl,hash,Perl,Hash,我有一个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 =>
%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"
);
读取散列时,不会按照定义读取密钥,而是随机读取密钥。我需要根据键的升序格式读取并运行散列上的循环,即检查块失败
,然后是检查块或块是否存在
,然后是检查块是否存在
和检查块是否存在
值“1\u xyz”
,“2\u xyz”
,“3\u xyz和“4\u xyz”
请告诉我这里是否有人能帮助我?是的。根据设计,散列键是随机顺序的
原因有很多,如和中所述,但最重要的是如果需要保留密钥顺序,则需要使用sort
或切片
:
my @order = qw ( first second third );
my %hash = ( second => 'a', third => 'b', first => 'c' );
print "@hash{@order}";
或:
数组以数字形式显式排序。散列是显式无序的(或随机顺序)
如果是自定义排序,则可以使用任何根据比较值返回-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";
}
使用严格;
使用警告;
使用数据::转储程序;
我的%typeMethodsMap=(
检查_REP_EXISTS=>“1_abc”,
检查JDK版本=>“2\u abc”,
检查\u块\u失败=>“1\u xyz”,
检查_或_EXISTS=>“2_xyz”,
检查\u UPG\u EXISTS=>“3\u xyz”,
检查“SSO”是否存在=>“4\u xyz”,
);
我的@order=qw(
检查\u REP\u是否存在
检查JDK版本
检查块失败
检查\u或\u是否存在
检查是否存在
检查是否存在SSO
);
我的$count=0;
我的%magic_order=map{$\u=>$count++}@order;
打印转储程序\%magic\u订单;
子自定义_排序{
返回$magic_order{$a}$magic_order{$b};
}
foreach my$key(排序{custom_sort}键%typeMethodsMap){
打印$key“\n”;
}
尽管注意-这并不是更有效,但它只是为了说明“自定义排序”。或者-如果您希望根据正在排序的“键”进行排序:
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
}
}
sub-custom\u排序{
my($a_编号,$a_文本)=拆分(“'u',$a);
my($b_number,$b_text)=拆分(''u',$b);
如果($a\U编号==$b\U编号){
返回$a_text cmp$b_text;
}
否则{
返回$a_编号$b_编号
}
}
这将首先按数字排序,然后按字母顺序排序。(如果需要相反的方法,请交换
和cmp
) 是的。根据设计,散列键是随机顺序的
原因有很多,如和中所述,但最重要的是如果需要保留密钥顺序,则需要使用sort
或切片
:
my @order = qw ( first second third );
my %hash = ( second => 'a', third => 'b', first => 'c' );
print "@hash{@order}";
或:
数组以数字形式显式排序。散列是显式无序的(或随机顺序)
如果是自定义排序,则可以使用任何根据比较值返回-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";
}
使用严格;
使用警告;
使用数据::转储程序;
我的%typeMethodsMap=(
检查_REP_EXISTS=>“1_abc”,
检查JDK版本=>“2\u abc”,
检查\u块\u失败=>“1\u xyz”,
检查_或_EXISTS=>“2_xyz”,
检查\u UPG\u EXISTS=>“3\u xyz”,
检查“SSO”是否存在=>“4\u xyz”,
);
我的@order=qw(
检查\u REP\u是否存在
检查JDK版本
检查块失败
检查\u或\u是否存在
检查是否存在
检查是否存在SSO
);
我的$count=0;
我的%magic_order=map{$\u=>$count++}@order;
打印转储程序\%magic\u订单;
子自定义_排序{
返回$magic_order{$a}$magic_order{$b};
}
foreach my$key(排序{custom_sort}键%typeMethodsMap){
打印$key“\n”;
}
尽管注意-这并不是更有效,但它只是为了说明“自定义排序”。或者-如果您希望根据正在排序的“键”进行排序:
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
}
}
sub-custom\u排序{
my($a_编号,$a_文本)=拆分(“'u',$a);
my($b_number,$b_text)=拆分(''u',$b);
如果($a\U编号==$b\U编号){
返回$a_text cmp$b_text;
}
否则{
返回$a_编号$b_编号
}
}
这将首先按数字排序,然后按字母顺序排序。(如果需要相反的方法,请交换
和cmp
) 如果你知道关键是什么,那么你可以只写
for my $key (qw/ 1_CHECK_BLOCKS_FAILED 2_CHECK_OR_EXISTS 3_CHECK_UPG_EXISTS /) {
...
}
否则,在构建散列时,您必须在单独的数组中跟踪键的顺序,或者使用类似于模块(有几个类似的模块)的方法来维护散列数据的顺序,如果您知道键是什么,那么您可以只写
for my $key (qw/ 1_CHECK_BLOCKS_FAILED 2_CHECK_OR_EXISTS 3_CHECK_UPG_EXISTS /) {
...
}
否则,在构建散列时,您必须在单独的数组中跟踪键的顺序,或者使用类似于模块的东西(有几个类似的)这保持了散列数据的顺序可能重复的非常抱歉,我现在编辑了我的问题,你能重新检查我更改的问题并为我提供解决方案吗?可能重复的非常抱歉,我现在编辑了我的问题,你能重新检查我更改的问题并为我提供解决方案吗?我尝试了$optionsKeys(排序{$typeMethodsMap{$a}cmp$typeMethodsMap{$b}}键%typeMethodsMap)
但它不起作用,因为这样做是按字母顺序排序的。如果这不是您想要的,那么您需要一个定义的顺序或自定义排序函数。我尝试了我的$optionsKeys(sort{$typeMethodsMap{$a}cmp$typeMethodsMap{$b}}keys%typeMethodsMap)
但它不起作用,因为这样做是按字母顺序排序的。如果这不是您想要的,那么您需要一个定义的顺序或自定义排序函数。