Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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_Hash - Fatal编程技术网

在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 =>

我有一个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"
);
读取散列时,不会按照定义读取密钥,而是随机读取密钥。我需要根据键的升序格式读取并运行散列上的循环,即
检查块失败
,然后是
检查块或块是否存在
,然后是
检查块是否存在
检查块是否存在
“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)
但它不起作用,因为这样做是按字母顺序排序的。如果这不是您想要的,那么您需要一个定义的顺序或自定义排序函数。