Quiero leer la entrada UTF-8 en Perl, sin importar si proviene de la entrada estándar o de un archivo, usando el operador de diamantes: while(<>){...}
.¿Cómo leo UTF-8 con operador de diamante (<>)?
Así que mi script debe ser exigible en estas dos formas, como de costumbre, dando el mismo resultado:
./script.pl utf8.txt
cat utf8.txt | ./script.pl
Pero las salidas variar! Solo la segunda llamada (usando cat
) parece funcionar como está diseñada, leyendo UTF-8 correctamente. Aquí está el script:
#!/usr/bin/perl -w
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
while(<>){
my @chars = split //, $_;
print "$_\n" foreach(@chars);
}
¿Cómo puedo hacer que lea UTF-8 correctamente en ambos casos? Me gustaría seguir usando el operador de diamante <>
para leer, si es posible.
EDIT:
me di cuenta de que probablemente debería describir las diferentes salidas. Mi archivo de entrada contiene esta secuencia: a\xCA\xA7b
. El método con cat
emite correctamente:
a
\xCA\xA7
b
Pero el otro método me da esto:
a
\xC3\x8A
\xC2\xA7
b
¿Tiene que tener el binmode mientras tanto porque ARGV se restablece para varios archivos? –
experimentalmente, sí :) – jrockway
Miré esto y pensé, "¡Eso no funcionará! Estás configurando' binmode' después de que la primera línea ya se haya leído de '<>' ". Sin embargo, lo probé, y * funciona *. Altamente mágico. – mavit