guia - ¿Cómo pueden clasificar Perl y Unix, ordenar cadenas Unicode en la misma secuencia?
perl guia completo pdf (1)
Usar Unicode :: Sort o Unicode :: Sort :: Locale no tiene sentido. No está tratando de ordenar según las definiciones de Unicode, está intentando ordenar según su configuración regional. Eso es lo que use locale;
es para.
No sé por qué no obtuvo el pedido deseado de cmp
under use locale;
.
Puede procesar los archivos descomprimidos.
for q in file1.uniqc file2.uniqc ; do
perl -ne''s/^/s*(/d+) //; for $c (1..$1) { print }'' "$q"
done | sort | uniq -c
Por supuesto, requerirá más almacenamiento temporal, pero obtendrá exactamente el orden que desee.
Encontré una use locale;
casos use locale;
no causó que el sort
/ cmp
Perl proporcionara el mismo resultado que la utilidad de sort
. Extraño.
$ 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
A decir verdad, es la utilidad de sort
que es extraño.
En los comentarios, @ninjalj señala que la rareza probablemente se deba a personajes con pesos indefinidos. Al comparar dichos caracteres, el orden no está definido, por lo que diferentes motores podrían producir resultados diferentes. Su mejor apuesta para recrear el orden exacto sería usar la utilidad de sort
través de IPC::Run3 , pero parece que no se garantiza que siempre IPC::Run3 como resultado el mismo orden.
Intento que Perl y el programa de ordenación GNU / Linux (1) acuerden cómo ordenar cadenas Unicode. Estoy ejecutando ordenar con LANG=en_US.UTF-8
. En el programa Perl probé los siguientes métodos:
-
use Unicode::Collate
con$Collator = Unicode::Collate->new();
-
use Unicode::Collate::Locale
con$Collator = Unicode::Collate->new(locale => $ENV{''LANG''});
-
use locale
Cada uno de ellos falló con los siguientes errores (del lado de Perl):
- La entrada no está ordenada: [----,] vino después de [($ 1]
- La entrada no está ordenada: [...] vino después de [&]
- La entrada no está ordenada: [($ 1] vino después de [1]
El único método que funcionó para mí consistió en configurar LC_ALL=C
para ordenar y usar caracteres de 8 bits en Perl. Sin embargo, de esta forma, las cadenas Unicode no están ordenadas correctamente.