2009-05-19 7 views

risposta

10

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 $.)

+0

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. –

+0

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

+0

... 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

7

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.

+1

E 'facile per stampare il numero di riga al posto della linea: while (<>) -; Questo dovrebbe risolvere il problema dichiarato –

+0

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. –

5

Oneliner:

perl -nE'say$.if/[\xE0-\xFF]/' 

per le versioni più vecchie di perl

perl -lne'print$.if/[\xE0-\xFF]/' 
2

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
1

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.

1

Che dire di grep?

grep [\x00-\x1F\x7F-\xFF]+ * 
Problemi correlati