按值排序数组的哈希

迪尔曼

我正在尝试按HoA中的值进行排序,其中key => [a,b,c]我想按字母顺序进行排序,并且尝试读取并没有成功。我认为是逗号,但请帮忙!以下是一个简短的摘要。原始数据与数据转储相对于CLI的显示方式完全相同。我必须使用某种定界符,否则cli输出是乏味的!谢谢!

use strict;
use warnings;

my ( $lsvm_a,$lsvm_b,%hashA,%hashB );
my $vscincludes  = qr/(^0x\w+)\,\w+\,\w+.*/;  #/

open (LSMAP_A, "-|", "/usr/ios/cli/ioscli lsmap -vadapter vhost7 -field clientid vtd backing -fmt ," ) or die $!;
while ($lsvm_a = (<LSMAP_A>)) {
     chomp($lsvm_a);
     next unless $lsvm_a =~ /$vscincludes/;
     @{$hashA{$1}} = (split ',', $lsvm_a);
}

open (LSMAP_B, "-|", "/usr/sbin/clcmd -m xxxxxx /usr/ios/cli/ioscli lsmap -vadapter vhost29 -field clientid vtd backing -fmt ," ) or die $!;
while ($lsvm_b = (<LSMAP_B>)) {
     chomp($lsvm_b);
     next unless $lsvm_b =~ /$vscincludes/;
     push @{$hashA{$1}}, (split ',', $lsvm_b);
}


print "\n\nA:";
for my $key ( sort { $hashA{$a} cmp $hashA{$b} } keys %hashA ) {
    print "$key => '", join(", ", @{$hashA{$key}}), "'\n";
}
##
print "===\nB:";
foreach my $key ( sort { (@{$hashB{$a}}) cmp (@{$hashB{$b}}) } keys %hashB ) {
    print "$key ==> @{$hashB{$key}}\n";
}

print "\n\n__DATA_DUMPER__\n\n";
use Data::Dumper; print Dumper \%hashA; print Dumper \%hashB;

输出量

答:
0x00000008> '0x00000008,atgdb003f_avg01,hdisk10,atgdb003f_ovg01,hdisk96,atgdb003f_pvg01,hdisk68,atgdb003f_rvg01,hdisk8,vtscsi0,atgdb003f_data.5bcd027df10f27bf9a880ce7bc1dd924' 
=== 
B:
0x00000008>“0x00000008,atgdb003f_avg01,hdisk10,atgdb003f_data,atgdb003f_data.5bcd027df10f27bf9a880ce7bc1dd924 ,atgdb003f_ovg01,hdisk96,atgdb003f_pvg01,hdisk68,atgdb003f_rvg01,hdisk8' 

__DATA_DUMPER__ 

$ VAR1 = { 
          ''0x00000008'=> [ 
                            ''0x00000008',
                            'atgdb003f_avg01',
                            'hdisk10',
                            'atgdb00301
                            'hdisk96',
                            'atgdb003f_pvg01',
                            'hdisk68',
                            'atgdb003f_rvg01',
                            'hdisk8',
                            'vtscsi0',
                            'atgdb003f_data.5bcd027df10f27bf9a880ce7bc1dd924' 
                          ] 
        }; 
$ VAR1 = { 
          '0x00000008'=> [ 
                            '0x00000008',
                            'atgdb003f_avg01',
                            'hdisk10',
                            'atgdb003f_data', 
                            'atgdb003f_data。
                            'atgdb003f_ovg01',
                            'hdisk96',
                            'hdisk68',
                            'atgdb003f_rvg01',
                            'hdisk8' 
                          ] 
        }; 

### CLI出### 
            ### 0x00000008,atgdb003f_avg01,hdisk10,atgdb003f_ovg01,hdisk96,atgdb003f_pvg01,hdisk68,atgdb003f_rvg01,hdisk8,vtscsi0,atgdb003f_data.5bcd027df10f27bf9a880ce7bc1dd924 
        ### 0x00000008,atgdb003f_avg01,hdisk10,atgdb003f_data,atgdb003f_data.5bcd027df10f27bf9a880ce7bc1dd924,atgdb003f_ovg01 ,hdisk96,atgdb003f_pvg01,hdisk68,atgdb003f_rvg01,hdisk8
出租

更新   数组引用(哈希值)毕竟具有多个元素,需要进行排序。然后

for my $key (keys %h) { @{$h{$key}} = sort @{$h{$key}} }

或者,更有效地(并且在语句修饰符形式中,具有较少的噪音,但可能不太清晰)

$h{$_} = [ sort @{$h{$_}} ] for keys %h;

排序默认使用字典序排序,被通缉。

希望对键进行数字排序,但是请注意,虽然我们可以重写数组以使其进行排序,但是哈希本身并不是无序的,因此不是这样。我们当然可以打印排序

foreach my $k (sort { $a <=> $b } keys %h) { ... } 

如果键不是数字,则会发出警告。

在v5.16和v5.30.0的三台不同机器上,按我的基准测试分别提高了56%– 60%


原始帖子

我认为您需要对一个具有arrayref作为值的哈希进行排序,从而该arrayref具有单个元素。然后排序,首先是元素

foreach my $key ( sort { $hashB{$a}->[0] cmp $hashB{$b}->[0] } keys %hashB ) {
    print "$key ==> @{$hashB{$key}}\n";
}

请参阅perlop中的Equality运算cmp符下的运算符它需要标量,并按字符串进行比较(因此,尝试对问题cmp中的数组进行排序是错误的,因为这样会得到要排序的那些数组的长度!)


据我了解,您要排序的哈希就像

$VAR1 = {
    '0x00000008' => [ 'atgdb003f_avg01,hdisk10,atgdb003f_ovg01,...' ],
    ...
}

其中每个值都是具有一个元素的arrayref。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章