Come posso trovare caratteri ASCII estesi in un file usando Perl? Qualcuno può ottenere la sceneggiatura?Come posso trovare caratteri ASCII estesi in un file usando Perl?
..... grazie in anticipo .....
Come posso trovare caratteri ASCII estesi in un file usando Perl? Qualcuno può ottenere la sceneggiatura?Come posso trovare caratteri ASCII estesi in un file usando Perl?
..... grazie in anticipo .....
Dal momento che i lunghi ASCII personaggi hanno valore 128 and higher, si può chiamare ord sui singoli personaggi e gestire quelli con un valore> = 128. La seguente codice legge dallo standard input e stampa solo i caratteri ASCII estesi:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
In alternativa, unpack insieme chr sarà anche funzionare. Esempio:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(Sono sicuro che alcuni Perl guru può condensare entrambe queste due battute ...)
Per stampare i numeri di riga, invece, è possibile utilizzare il seguente (questo non rimuovere i duplicati, ed avrà un comportamento strano quando viene passata unicode):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(. Grazie Yaakov Belch per la punta $.
)
Il primo carattere ASCII stampabile è space
(32). L'ultimo carattere ASCII stampabile è ~
(126). Quindi probabilmente sarei uso
while (<>) {
print "$.\n" if /[^ -~]/;
}
anche se sarà, certamente, anche visualizzare le righe che contengono caratteri di controllo così come ASCII esteso.
Modifica: Modificato per stampare il numero di riga anziché la linea stessa.
E 'facile per stampare il numero di riga al posto della linea: while (<>) -; Questo dovrebbe risolvere il problema dichiarato –
Ops {print if/[^ ~]/"$. \ N"}! Stavo solo leggendo la domanda stessa e ho mancato che il titolo specificasse che voleva il numero di riga. Grazie per la cattura. –
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
per le versioni più vecchie di perl
perl -lne'print$.if/[\xE0-\xFF]/'
Una questione cruciale è se i
uso di byte;
pragma dovrebbe essere in vigore. Il poster dovrebbe decidere che. Per scegliere caratteri con codici superiori a 127, il seguente sarà sufficiente:
print grep 127 < ord, split // while <>;
o
print grep /[^[:ascii:]]/, split // while <>;
risposta
Hynek -Pichi- di Vychodil:
perl -nE'say$.if/[\xE0-\xFF]/'
tests solo una parte limitata della non-stampa dovrebbe presumibilmente essere
perl -nE'say$.if/[\x80-\xFF]/'
invece.
Che dire di grep?
grep [\x00-\x1F\x7F-\xFF]+ *
E 'molto lento e inefficace approccio, vedere la soluzione di Dave Sherohman http://stackoverflow.com/questions/881931/how-to-print-numbers-of-line-containing-extended-ascii-characters -in-perl/882113 # 882113 È molto più veloce e più semplice. –
Questa risposta è stata pubblicata prima di Dave. Ho visto l'approccio di Dave, ed è da preferire nella maggior parte dei casi. Questo dimostra solo che sono un novizio Perl. Ho scelto di non cancellare questa risposta perché l'ultima parte sembra fare esattamente ciò che l'interrogante vuole. Vedi anche http://stackoverflow.com/questions/882122/reading-a-file-char-by-char-and-checking-for-extented-ascii-char – Stephan202
... ah, quella pagina è stata cancellata. Basti dire che la domanda affermava che il numero di riga doveva essere stampato per * ogni * carattere ASCII esteso. Questo è ciò che fa la mia soluzione. – Stephan202