Bienvenido a los foros de Perl en Español, zolidus.
La solución es fácil. Ni siquiera tienes que escribir un programa. Te vale con el siguiente comando, en la línea de órdenes:
Using bash Syntax Highlighting
perl -nle 'print $. and exit if /^jose$/' documentos.txt
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
Explicación:
- la opción -n sirve para hacer un bucle por las líneas de los archivos indicados como argumentos (documento.txt)
- la opción -l añade un carácter de fin de línea a todos los print() que usemos (somos tan vagos que no queremos escribir "\n" en el código)
- la opción -e ejecuta el código de una línea que sigue a continuación (lo que está entrecomillado simple)
La opción -n lee una línea cada vez, y la almacena en
$_, y ejecuta el código.
En el código, hay una expresión seguida de una pos-condición, así que primero evalúa la condición de la pos-condición (es más fácil leer el código que este rollo).
La condición es una expresión regular. Comprueba si en la variable $_ (la línea leída) hay algo que concuerde con el patrón 'jose', y solo con esas cuatro letras (no nos vale 'juanjose'). Por eso usamos las anclas '^' y '$'.
Si la condición se cumple, se evalúa la expresión, que es un print() y (and) un exit().
El print saca el valor de la variable especial
$. que almacena el número de la línea leída dentro del archivo.
Como la ejecución de un print() casi siempre tiene éxito, pues devuelve un valor verdadero, así que Perl comprueba el segundo operador del and, que es un exit(), y exit(), pues... termina el programa (no hace falta seguir buscando más).
Queda más corto decir "imprime el número de línea del archivo y termina si la línea coincide con el patrón 'jose'".
Otra solución:
Using bash Syntax Highlighting
perl -nlE 'print $. and exit if $_ eq "jose"' documentos.txt
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4