정렬과 함께 사용할 수있는 Perl 비교 함수가 필요합니다.정렬을위한 하위 키 비교 함수
각 키는 구분 문자 (점, 콜론, 공백 및 슬래시)로 구분 된 임의의 수의 하위 키가있는 텍스트 문자열입니다. 일부 하위 키는 숫자이며 숫자로 정렬해야합니다. 키 형식 및 하위 키 수는 다양합니다. 따라서 비교는 하나의 키가 다른 키보다 길게 처리해야하며 하위 키가 한 키에서는 숫자이지만 다른 키에서는 그렇지 않은 경우를 처리해야합니다.이 경우 텍스트 비교가 해당 하위 키에 적합합니다.
이 작동하지만, 나는 거기에 더 나은 솔루션을 내기 : 내 목적을 위해
use warnings;
use strict;
use Scalar::Util qw[looks_like_number];
sub hier_cmp {
my $aa = $a;
my $bb = $b;
# convert all delims (. :/space) to the same delim
$aa =~ tr/.:\/ /::::/;
$bb =~ tr/.:\/ /::::/;
my @lista = split(":", $aa);
my @listb = split(":", $bb);
my $result;
for my $ix (0 .. min($#lista, $#listb)) {
if (exists($lista[$ix]) && exists($listb[$ix])) {
if (looks_like_number($lista[$ix]) && looks_like_number($listb[$ix])) {
# compare numerically
$result = ($lista[$ix] <=> $listb[$ix]);
} else {
# compare as strings
$result = ($lista[$ix] cmp $listb[$ix]);
}
if ($result == 0) {
next;
}
return $result;
} elsif (exists($lista[$ix])) {
return 1;
} else {
return -1;
}
}
}
는 가독성은 속도보다 더 중요하다. 이는 내부 도구 용 일 뿐이며 목록에는 거의 수백 가지 요소가 포함되지 않습니다. 그러나, 어떤 것을 배울 기회는 좋습니다.
보시다시피 필자는 펄 마법사가 아닙니다. 심지어 내 코드에 대한 사소한 향상도 인정 될 것이다.
감사합니다.
:'내 @lista = 분할 m {[/.]} $의 AA,' – toolic
당신이 정렬 할 데이터의 샘플을 공유 할 수 있습니까? – Kenosis
FWIW 다른 하위 키 목록이 더 길지만 현재까지는 동일하지 않은 경우 하위 키 비교가 더 짧은 하위 키 목록의 최종 인덱스에서 잘못 중지됩니다. '사용 특징 qw (말하기) 비교; 'sort hier_cmp qw (foo : bar foo)'라고 말하면서 hier_cmp qw (foo foo : bar)를 말하십시오. – pilcrow