Spec-Zone.ru › Perl 5.28

sort

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
  • ЗАМЕЧАНИЯ

ИМЯ

sort - Perl-pragma для управления поведением 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
}

ОПИСАНИЕ

С помощью pragmy sort вы можете контролировать поведение встроенной функции 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.28.3/sort

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API