Подтвердить что ты не робот

Как Perl и Unix сортируют, заказывают строки Unicode в одной последовательности?

Я пытаюсь заставить Perl и программу сортировки (1) GNU/Linux договориться о том, как сортировать строки Unicode. Я выполняю сортировку с LANG=en_US.UTF-8. В программе Perl я пробовал следующие методы:

Каждый из них потерпел неудачу со следующими ошибками (со стороны Perl):

  • Вход не сортируется: [----,] пришел после [($ 1]
  • Вход не сортируется: [...] пришел после [&]
  • Вход не сортируется: [($ 1] пришел после [1]

Единственный метод, который работал у меня, включал настройку LC_ALL=C для сортировки и использование 8-битных символов в Perl. Однако, таким образом, строки Unicode не упорядочены должным образом.

4b9b3361

Ответ 1

Использование Unicode:: Sort или Unicode:: Sort:: Locale не имеет смысла. Вы не пытаетесь сортировать, основываясь на определениях Unicode, которые вы пытаетесь сортировать на основе своего языка. Для чего use locale;.

Я не знаю, почему вы не получили желаемый порядок из cmp под use locale;.

Вы можете обрабатывать распакованные файлы.

for q in file1.uniqc file2.uniqc ; do
   perl -ne's/^\s*(\d+) //; for $c (1..$1) { print }' "$q"
done | sort | uniq -c

Разумеется, для этого потребуется больше временного хранилища, но вы получите именно тот порядок, который вам нужен.


Я нашел случай use locale; не вызывал Perl sort/cmp, чтобы получить тот же результат, что и утилита sort. Weird.

$ export LC_COLLATE=en_US.UTF-8

$ perl -Mlocale -e'print for sort { $a cmp $b } <>' data
(
($1
1

$ perl -MPOSIX=strcoll -e'print for sort { strcoll($a, $b) } <>' data
(
($1
1

$ sort data
(
1
($1

По правде говоря, это утилита sort, которая странная.


В комментариях @ninjalj указывает, что странность, вероятно, связана с символами с весами undefined. При сравнении таких символов порядок undefined, поэтому разные двигатели могут давать разные результаты. Лучшим вариантом для воссоздания точного порядка будет использование утилиты sort с помощью IPC::Run3, но похоже, что это не гарантировано всегда приводят к тому же порядку.