странное поведение

Если кавычки нельзя вложить или экранировать, просто разделите ввод на кавычки, измените каждый нечетный элемент и снова соедините кавычками:

#!/usr/bin/perl
use warnings;
use strict;

my $input = '"----, ----",, ----, ----,,"",start quote," starting
 next line with end quote, ",---,, "---,", "begin quote,,
,,nxt line end quote ",----, ----",, ----, "----,,"---","",
----,","----, ----",,"", --",--,----,,,';

my @segments = split /"/, $input;  # fix SO syntax highlighting: "
s/,/@/g for @segments[ grep $_ % 2, 0.. $#segments ];
print join '"', @segments;
1
01.04.2020, 05:41
2 ответа

Это зависит от порядка сортировки в вашей локали.

Порядок сортировки — это набор правил для каждой локали, которые позволяют упорядочивать буквы с диакритическими знаками (, например, ñбудет стоять после n, но перед oв испанском языке ).

Но это не так, порядок сортировки также указывает, какие символы следует игнорировать при сортировке. Для локали "C" учитываются все символы, но для "en _US", например, тире (U002D )игнорируется, как и для большинства других локалей, так как они наследуют определения от iso14651 _t1 _общий (в /usr/share/i18n/locales/ в некоторых дистрибутивах ).

Таким образом, порядок для вашего первого файла не представляет проблемы, поскольку, когда вы игнорируете тире, вы получаете простое сравнение по алфавиту:

      -- ignore dashes -->      -- sort --> 
0-                          0               0
01-                         01              01 

Когда вы добавляете букву «Т», все меняется, почему? Потому что теперь, если вы проигнорируете тире, вам придется сравнивать «1» и «Т» (, первый символ один и тот же ), а «1» стоит перед «Т» :

.
      -- ignore dashes -->      -- sort --> 
0-T                          0T               01T
01-T                         01T              0T

Таким образом, рекомендуется всегда убедиться, что вы используете правила "C", используя LC _COLLATE=C при сортировке.

В вашем случае:

$ cat <<EOF | LC_COLLATE=C sort
0-T
01-T
EOF

дает:

0-T
01-T

Как вы и ожидали.

4
19.03.2021, 02:30

Да, это может показаться раздражающим. (в локали по умолчанию en _US.UTF -8)

$ printf '%s\n' 1 1- 1-a 11- 11-a | sort
1
1-
11-
11-a
1-a

Причина в том, что -назначается no weightдля порядка сортировки.

Аналогично тому, что должен делать ":

printf '%s\n' 1 \"1\" 1- \"1-\" 1-a \"1-a\" 11- \"11-\" 11-a \"11-a\" | sort
"1"
"1-"
1
1-
"11-"
11-
"11-a"
11-a
"1-a"
1-a

Как вы можете видеть выше, все 1 сортируются вместе, все 11также. Проблема в том, что 1-aсортируется больше как 1a, чем что-либо еще :

.
printf '%s\n' 1-a 1-b 1-c 1a 1b 1c| sort
1-a
1a
1-b
1b
1-c
1c

Вопрос о том, следует ли включать пунктуацию (-, ", ;и другие )в порядок сортировки сопоставления, является спорным. Преобладающее мнение состояло в том, что это не должно (в локалях, отличных от -ASCII ).

Общий файл для большинства латинских языков — /usr/share/i18n/locales/iso14651_t1_common. В этом файлеHYPHEN-MINUS(да то, что мы, говоря простым языком, называем тире. Unicode U -002D )порядок сортировки установлен на:

<U002D> IGNORE;IGNORE;IGNORE;<U002D> % HYPHEN-MINUS

То есть игнорировать первые три уровня сопоставления.

1
19.03.2021, 02:30

Теги

Похожие вопросы