我正在尝试按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] 删除。
我来说两句