/ / Wie können Perl und Unix Unicode-Strings in derselben Reihenfolge sortieren? - Perl, Sortieren, Unix, Unicode, Gebietsschema

Wie können Perl und Unix Unicode-Strings in der gleichen Reihenfolge sortieren? - Perl, Sortierung, Unix, Unicode, Gebietsschema

Ich versuche, Perl und das GNU / Linux zu bekommen Sortieren(1) Programm vereinbart, wie Unicode-Zeichenfolgen zu sortieren sind. Ich renne Sortieren mit LANG=en_US.utf-8. Im Perl-Programm habe ich folgende Methoden ausprobiert:

Jeder von ihnen schlug mit den folgenden Fehlern (von der Perl-Seite) aus:

  • Eingabe ist nicht sortiert: [----,] kam nach [($ 1])
  • Eingabe ist nicht sortiert: [...] kam nach [&]
  • Eingabe ist nicht sortiert: [($ 1] kam nach [1]

Die einzige Methode, die für mich funktionierte, beinhaltete das Einstellen LC_ALL=C zum Sortierenund 8-Bit-Zeichen in Perl verwenden. Auf diese Weise werden Unicode-Zeichenfolgen jedoch nicht ordnungsgemäß angeordnet.

Antworten:

5 für die Antwort № 1

Die Verwendung von Unicode :: Sort oder Unicode :: Sort :: Locale macht keinen Sinn. Sie versuchen nicht, nach Unicode-Definitionen zu sortieren, sondern nach Ihrem Gebietsschema. Das ist, was use locale; ist für.

Ich weiß nicht, warum Sie die gewünschte Reihenfolge nicht erhalten haben cmp unter use locale;.

Sie können die dekomprimierten Dateien verarbeiten.

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

Es wird natürlich mehr temporärer Speicherplatz benötigt, aber Sie erhalten genau die gewünschte Reihenfolge.


Ich habe einen Fall gefunden use locale; hat keine Perls verursacht sort/cmp dasselbe Ergebnis wie das sort Nützlichkeit. Seltsam.

$ 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

Um ehrlich zu sein, ist es das sort Dienstprogramm das ist seltsam.


In den Kommentaren weist @ninjalj darauf hin, dass dieSeltsamkeit ist wahrscheinlich auf Zeichen mit undefinierten Gewichten zurückzuführen. Beim Vergleich solcher Zeichen ist die Reihenfolge undefiniert, sodass unterschiedliche Engines zu unterschiedlichen Ergebnissen führen können. Die beste Wette, um die genaue Reihenfolge wiederherzustellen, wäre die Verwendung der sort Nutzen durch IPC :: Run3, aber es hört sich so an, als ob dies nicht immer in der gleichen Reihenfolge resultiert.