2009-05-19 18 views

Respuesta

10

Desde los prolongados ASCII caracteres tienen un valor 128 and higher, sólo puede llamar a ord en los personajes individuales y manejar aquellos con un valor> = 128. La siguiente código lee de la entrada estándar e imprime sólo los caracteres ASCII extendidos:

while (<>) { 
    while (/(.)/g) { 
    print($1) if (ord($1) >= 128); 
    } 
} 

Alternativamente, unpack junto con chr también funcionará. Ejemplo:

while (<>) { 
    foreach (unpack("C*", $_)) { 
    print(chr($_)) if ($_ >= 128); 
    } 
} 

(estoy seguro que algún gurú Perl puede condensarse ambos a dos de una sola línea ...)


Para imprimir los números de línea en su lugar, puede utilizar el siguiente (esto no eliminar duplicados, y tendrá un comportamiento extraño cuando se pasa unicode):

while (<>) { 
    while (/(.)/g) { 
    print($. . "\n") if (ord($1) >= 128); 
    } 
} 

(. Gracias por la punta Yaakov Belch$.)

+0

Es muy lento y el enfoque ineficaz, consulte la solución de Dave Sherohman http://stackoverflow.com/questions/881931/how-to-print-numbers-of-line-containing-extended-ascii-characters -in-perl/882113 # 882113 Es mucho más rápido y simple. –

+0

Esta respuesta fue publicada antes de Dave's. He visto el enfoque de Dave, y es preferible en la mayoría de los casos. Esto solo muestra que soy un principiante de Perl. Elijo no eliminar esta respuesta porque la última parte parece hacer exactamente lo que el interlocutor quiere. También vea http://stackoverflow.com/questions/882122/reading-a-file-char-by-char-and-checking-for-extented-ascii-char – Stephan202

+0

... ah, esa página ha sido eliminada. Baste decir que la pregunta establece que el número de línea debe imprimirse para * cada * carácter ASCII extendido. Esto es lo que hace mi solución. – Stephan202

7

El primer carácter ASCII imprimible es space (32). El último carácter ASCII imprimible es ~ (126). Probablemente usaría

while (<>) { 
    print "$.\n" if /[^ -~]/; 
} 

aunque, ciertamente, también mostrará líneas que contengan caracteres de control y ASCII extendido.

Editar: Se ha modificado para imprimir el número de línea en lugar de la línea.

+1

Es fácil de imprimir el número de línea en lugar de la línea: mientras que (<>) -; Esto debería resolver el problema planteado –

+0

chillidos {impresión si/[^ ~]/"$. \ N"}! Estaba leyendo la pregunta y me perdí de que el título especificara que quería el número de línea. Gracias por la captura. –

5

Oneliner:

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

para las versiones más antiguas de Perl

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

Una cuestión crucial es si los bytes uso

;

pragma debe estar en vigor. El póster debería decidir eso. Para recoger caracteres con los códigos superiores a 127, lo siguiente será suficiente:

print grep 127 < ord, split // while <>; 

o

print grep /[^[:ascii:]]/, split // while <>; 
respuesta
1

Hynek -Pichi- de Vychodil:

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

pruebas de sólo una parte limitada de la falta de impresión debería presumiblemente ser

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

en su lugar.

1

¿Qué pasa con grep?

grep [\x00-\x1F\x7F-\xFF]+ * 
Cuestiones relacionadas