Pregunta

¿Cómo puedo encontrar caracteres ASCII extendidos en un archivo usando Perl? ¿Alguien puede conseguir la escritura?

..... gracias de antemano .....

¿Fue útil?

Solución

Desde las href="http://en.wikipedia.org/wiki/ASCII" caracteres tienen un valor 128 y superior , sólo puede llamar a ord en los personajes individuales y manejar aquellos con un valor> = 128. El 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, de desempaquetado 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 Yaakov eructo por la punta $..)

Otros consejos

El primer carácter ASCII imprimible es space (32). El último carácter ASCII imprimible es ~ (126). Así que probablemente me utilizo

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

aunque será, ciertamente, también mostrar las líneas que contienen caracteres de control, así como ASCII extendido.

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

Oneliner:

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

para versiones anteriores de Perl

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

Una cuestión crucial es si el

Utilice bytes;

Pragma debe estar vigente. El cartel debe 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

Hynek -Pichi- de Vychodil:

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

Sólo las pruebas una parte limitada de la no impresión presumiblemente debe ser

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

en su lugar.

¿Qué hay de grep?

grep [\x00-\x1F\x7F-\xFF]+ *
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top