Подгруппа сортировки (материал в {}
после sort
) определяет двухуровневую сортировку: сначала по имени, затем по количеству ветвей. 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 ложно, а -1 и 1 истинны. Если cmp
возвращает истинное значение, or
немедленно возвращает это значение, а sort
соответствующим образом переупорядочивает элементы. Если cmp
возвращает false, оценивается <=>
и вместо этого возвращается его результат.
При многослойной сортировке обычно используется метод «карта-сортировка-карта» (также известный как преобразование Шварца). а>):
@animals =
map { $_->[0] }
sort {
$a->[1] cmp $b->[1] ||
$a->[2] <=> $b->[2]
}
map { [$_, $animal{$_}{name}, $animal{$_}{legs}] }
keys %animal;
Это не так ясно, но поскольку обычно имеет лучшую производительность, это распространенная идиома. Это особенно важно, когда операнды сравнения являются функциями — этот метод предотвращает ненужный (и, возможно, дорогостоящий) повторный расчет для каждого сравнения. Например, если вы сортируете строки по длине, вам нужно вычислить длину каждой строки только один раз.
person
Michael Carman
schedule
17.06.2009