按值排序数组的哈希

时间:2019-12-11 20:09:46

标签: arrays perl sorting hash

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

$Item = $InfoPathLibrary.GetItemById(Convert.ToInt32($ItemID))

输出

A:
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',
                            'atgdb003f_ovg01',
                            'hdisk96',
                            'atgdb003f_pvg01',
                            'hdisk68',
                            'atgdb003f_rvg01',
                            'hdisk8',
                            'vtscsi0',
                            'atgdb003f_data.5bcd027df10f27bf9a880ce7bc1dd924'
                          ]
        };
$VAR1 = {
          '0x00000008' => [
                            '0x00000008',
                            'atgdb003f_avg01',
                            'hdisk10',
                            'atgdb003f_data',
                            'atgdb003f_data.5bcd027df10f27bf9a880ce7bc1dd924',
                            'atgdb003f_ovg01',
                            'hdisk96',
                            'atgdb003f_pvg01',
                            'hdisk68',
                            'atgdb003f_rvg01',
                            'hdisk8'
                          ]
        };

### CLI out ### 
            ###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

1 个答案:

答案 0 :(得分:3)

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

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

或更有效地(并且以statement modifier的形式,具有较少的噪音但可能不太清晰)

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

sort默认情况下根据需要使用字典排序。

希望对键进行数字排序,但是请注意,尽管我们可以重写数组以使其进行排序,但哈希本来就不是这样,哈希本质上是无序的。我们当然可以打印排序

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";
}

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


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

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

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