문제

다음 코드의 결과를 볼 수 있지만 정확히 어떻게 or 다음에서해야 할 일을 알고 있습니다 sort 예시:

use Data::Dumper;

$animals{'man'}{'name'} = 'paul';
$animals{'man'}{'legs'} = 2;
$animals{'cheeta'}{'name'} = 'mike';
$animals{'cheeta'}{'legs'} = 3;
$animals{'zebra'}{'name'} = 'steve';
$animals{'zebra'}{'legs'} = 4;
$animals{'cat'}{'name'} = '';
$animals{'cat'}{'legs'} = 3;
$animals{'dog'}{'name'} = '';
$animals{'dog'}{'legs'} = 4;
$animals{'rat'}{'name'} = '';
$animals{'rat'}{'legs'} = 5;

@animals = sort {
      $animals{$a}{'name'} cmp $animals{$b}{'name'}
   or $animals{$a}{'legs'} <=> $animals{$b}{'legs'}
} keys %animals;

print Dumper(\@animals);
도움이 되었습니까?

해결책

or 단락 평가자이므로 왼쪽 값이 사실이면 (0이 아닌 값이든)의 값을 반환하고 그렇지 않으면 오른쪽을 평가합니다.

따라서이 경우 동물의 이름이 동일 (0 -false)으로 비교되면 다리의 수는 정렬 목적으로 계산됩니다.

다른 팁

Sortsub (물건 {}sort)는 2 계층 정의를 정의합니다. 이름별로, 다리 수에 의해. 그만큼 or 두 기준 사이의 교차점을 구현합니다. 코드를 다르게 포맷하는지 확인하는 것이 더 쉽습니다.

@animals = sort {
    $animals{$a}{'name'} cmp $animals{$b}{'name'} or
    $animals{$a}{'legs'} <=> $animals{$b}{'legs'}
} keys %animals;

그만큼 cmp 그리고 <=> 연산자는 왼쪽 인수가 오른쪽 인수보다 적은지, 동일 또는 크지 여부에 따라 세 값 (-1, 0 또는 1) 중 하나를 반환합니다. (cmp 문자열 비교를하고 <=> 숫자는 숫자를 수행합니다.) Perl에서 0, 0은 false이고 -1, 1은 참입니다. 만약 cmp 진정한 값을 반환합니다 or 그 값을 즉시 반환하고 sort 요소를 적절하게 다시 작성합니다. 만약 cmp 거짓을 반환합니다 <=> 평가되고 결과가 대신 반환됩니다.

다층 정렬을 수행 할 때 "Map-Sort-Map"기술을 사용하는 것이 일반적입니다 (일명 Schwartzian 변환):

@animals =
  map  { $_->[0] }
  sort {
    $a->[1] cmp $b->[1] ||
    $a->[2] <=> $b->[2]
  }
  map { [$_, $animal{$_}{name}, $animal{$_}{legs}] }
  keys %animal;

명확하지는 않지만 일반적으로 더 나은 성능을 가지고 있기 때문에 일반적인 관용구입니다. 이것은 비교의 피연산자가 함수 일 때 특히 중요합니다.이 기술은 모든 비교에 대해 불필요한 (그리고 아마도 비싼) 재 계산을 방지합니다. 예를 들어, 줄을 길이로 정렬하는 경우 각 문자열의 길이를 한 번만 계산하면됩니다.

제안해도됩니다 Sort::Key 현재 코드의 대안으로?

use Sort::Key::Multi qw(sikeysort);  # sort keyed on (string, integer)
@animals = sikeysort { $animals{$_}{name}, $animals{$_}{legs} } keys %animals;

# alternately,
use Sort::Key::Maker sort_by_name_then_legs =>
    sub { $animals{$_}{name}, $animals{$_}{legs} }, qw(string integer);
@animals = sort_by_name_then_legs keys %animals;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top