2013-05-20 5 views
2

해시 있습니다. 해시 키는 긴 문자열입니다. "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; 

에 의해 내 해시를 정렬합니다.

답변

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; 
+0

훌륭하게 일 해줘서 고맙습니다. – Jabda

+0

이것은 늦은 요청이지만 첫 번째 및 두 번째지도가 어떻게 작동하는지 설명 할 수 있습니까? – Jabda

+1

@ Jabda : 첫 번째 맵 (아래쪽부터 시작)은 키를 정렬하는 데 사용할 하위 문자열을 추출합니다. 나중에 사용할 두 값이있는 arrayref를 반환합니다. 두 번째 것은'sort'에서 사용되고 첫 번째 것은 두 번째'map'에서 추출됩니다. – Birei

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; 
관련 문제