ruby - por - para que sirve int argc char*argv[]
¿Cómo imprimo el número de línea del archivo con el que estoy trabajando a través de ARGV? (1)
Actualmente estoy abriendo un archivo tomado en tiempo de ejecución a través de ARGV:
File.open(ARGV[0]) do |f|
f.each_line do |line|
Una vez que se encuentra una coincidencia, imprimo la salida para el usuario.
if line.match(/(strcpy)/i)
puts "[!] strcpy does not check for buffer overflows when copying to destination."
puts "[!] Consider using strncpy or strlcpy (warning, strncpy is easily misused)."
puts " #{line}"
end
Quiero saber cómo imprimir el número de línea para la línea coincidente en el archivo (ARGV [0]).
Usando print __LINE__
muestra el número de línea del script de Ruby. He intentado muchas variaciones diferentes de la print __LINE__
con diferentes interpolaciones de cadenas de #{line}
sin éxito. ¿Hay alguna forma de que pueda imprimir el número de línea del archivo?
Cuando la clase de IO de Ruby abre un archivo, establece $.
variable global a 0. Para cada línea que se lee esa variable se incrementa. Entonces, para saber qué línea se ha leído, simplemente use $.
.
Mire en el módulo en inglés por $.
o $INPUT_LINE_NUMBER
.
También podemos usar el método lineno
que es parte de la clase IO. Me resulta un poco más intrincado porque necesitamos un objeto de transmisión IO para agregarlo, mientras que $.
funcionará siempre
Escribiría el ciclo más simplemente:
File.foreach(ARGV[0]) do |line|
Algo en lo que pensar es que, si está en un sistema * nix, puede usar la herramienta grep
o fgrep
incorporada del sistema operativo para acelerar su procesamiento. La familia de aplicaciones "grep" está altamente optimizada para hacer lo que desea, y puede encontrar todas las instancias, solo la primera, puede usar expresiones regulares o cadenas fijas, y se puede llamar fácilmente usando los operadores %x
o backtick de Ruby.
puts `grep -inm1 abacus /usr/share/dict/words`
Qué salidas:
34:abacus
-inm1
significa "ignorar el caso del personaje", "números de línea de salida", "detener después de la primera aparición"