按perl字符串的子集排序

时间:2013-05-20 22:41:11

标签: regex perl

我有一个哈希。散列键是一个长字符串“str_3432_123_A12_C02_xy_ut”我想通过字符串的一个子集对键进行排序,该字符串的格式为A12_C02。我假设字符串中没有其他部分与正则表达式匹配,但字符串内的位置可能不同。

 [A-Za-z][0-9]{2}_[A-Za-z][0-9]{2} 

按键对哈希进行排序

  my @sorted = sort keys %myhash;

我还有可能匹配的所有值的单独数组。

2 个答案:

答案 0 :(得分:3)

使用mapsort的组合提取您要用于排序的字符串部分并在完成后恢复整个密钥,例如:

my @sorted = 
    map { $_->[0] } 
    sort { $a->[1] cmp $b->[1] } 
    map { m/([A-Za-z][0-9]{2}_[A-Za-z][0-9]{2})/ && [$_, $1] } 
    keys %myhash;

答案 1 :(得分:3)

至少如果它不是一个巨大的类别,一个简单的解决方案是直接使用sort

my $re = /([a-z][0-9]{2}_[a-z][0-9]{2})/i;
my @sorted = sort {
        ($a) = $a =~ $re;
        ($b) = $b =~ $re;
        $a cmp $b;
    }
    keys %hash;