Desidero leggere l'input UTF-8 in Perl, indipendentemente dal fatto che provenga dallo standard input o da un file, utilizzando l'operatore diamond: while(<>){...}
.Come faccio a leggere UTF-8 con operatore diamantato (<>)?
Quindi il mio script deve essere richiamabile in questi due modi, come al solito, dando la stessa uscita:
./script.pl utf8.txt
cat utf8.txt | ./script.pl
Ma le uscite diverse! Solo la seconda chiamata (usando cat
) sembra funzionare come progettata, leggendo correttamente UTF-8. Ecco lo script:
#!/usr/bin/perl -w
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
while(<>){
my @chars = split //, $_;
print "$_\n" foreach(@chars);
}
Come posso farlo leggere UTF-8 correttamente in entrambi i casi? Vorrei continuare a utilizzare l'operatore diamond <>
per la lettura, se possibile.
EDIT:
ho capito probabilmente avrei dovuto descrivere i diversi uscite. Il mio file di input contiene questa sequenza: a\xCA\xA7b
. Il metodo con cat
uscite correttamente:
a
\xCA\xA7
b
Ma l'altro metodo mi dà questo:
a
\xC3\x8A
\xC2\xA7
b
È necessario avere il binmode nel frattempo perché ARGV viene ripristinato per più file? –
sperimentalmente, sì :) – jrockway
Ho guardato questo e ho pensato, "Non funzionerà! Stai impostando' binmode' dopo che la prima riga è già stata letta da '<>' ". Comunque, l'ho provato, e * funziona *. Altamente magico. – mavit