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:
use Unicode::Collate
mit$Collator = Unicode::Collate->new();
use Unicode::Collate::Locale
mit$Collator = Unicode::Collate->new(locale => $ENV{"LANG"});
use locale
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 № 1Die 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.