sort
СОДЕРЖАНИЕ
ИМЯ
sort - pragma Perl для управления поведением sort()
СИНТАКСИС
use sort 'stable'; # guarantee stability
use sort 'defaults'; # revert to default behavior
no sort 'stable'; # stability not important
my $current;
BEGIN {
$current = sort::current(); # identify prevailing pragmata
} ОПИСАНИЕ
С помощью sort pragmy вы можете управлять поведением встроенной функции sort().
Стабильная сортировка означает, что для записей, которые сравниваются как равные, сохраняется исходный порядок ввода. Стабильность будет важна только в том случае, если элементы, которые сравниваются как равные, могут быть отличимы каким-либо другим способом. Это означает, что простая числовая и лексическая сортировка не выигрывают от стабильности, так как равные элементы неразличимы. Однако, с таким сравнением, как
{ substr($a, 0, 3) cmp substr($b, 0, 3) } стабильность может иметь значение, потому что элементы, которые сравниваются как равные по первым 3 символам, могут быть отличены по последующим символам.
Является ли сортировка стабильной по умолчанию, является случайностью реализации, которая может изменяться (и изменялась) между версиями Perl. Если стабильность важна, обязательно укажите это с помощью
use sort 'stable'; Pragma no sort не *запрещает* то, что следует за ним, он просто оставляет выбор открытым. Таким образом, после
no sort 'stable'; сортировка может оказаться стабильной и так.
ЗАМЕЧАНИЯ
Начиная с Perl 5.10, этот pragma имеет лексическую область видимости и вступает в силу во время компиляции. В более ранних версиях его действие было глобальным и вступало в силу во время выполнения; в документации предлагалось использовать eval() для изменения поведения:
{ eval 'no sort "stable"'; # stability not wanted
print sort::current . "\n";
@a = sort @b;
eval 'use sort "defaults"'; # clean up, for others
}
{ eval 'use sort qw(defaults stable)'; # force stability
print sort::current . "\n";
@c = sort @d;
eval 'use sort "defaults"'; # clean up, for others
} Такой код больше не имеет желаемого эффекта по двум причинам. Во-первых, использование eval() означает, что алгоритм сортировки не изменяется до времени выполнения, когда уже слишком поздно оказывать какое-либо влияние. Во-вторых, sort::current также вызывается во время выполнения, когда фактически значение sort::current во время компиляции является тем, что имеет значение.
Итак, теперь этот код будет написан:
{ no sort "stable"; # stability not wanted
my $current;
BEGIN { $current = sort::current; }
print "$current\n";
@a = sort @b;
# Pragmas go out of scope at the end of the block
}
{ use sort qw(defaults stable); # force stability
my $current;
BEGIN { $current = sort::current; }
print "$current\n";
@c = sort @d;
}
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.30.3/sort