2013-10-04 18 views
6

Sono attualmente l'apertura di un file di presa in fase di esecuzione tramite ARGV:Come si stampa il numero di riga del file con cui sto lavorando tramite ARGV?

File.open(ARGV[0]) do |f| 
    f.each_line do |line| 

Una volta che viene trovata una corrispondenza stampo uscita per l'utente.

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 

voglio sapere come stampare il numero di riga per la linea corrispondente nel file (ARGV [0]).

L'utilizzo di print __LINE__ mostra il numero di riga dallo script Ruby. Ho provato diverse varianti di print __LINE__ con diverse interpolazioni di stringa di #{line} senza successo. C'è un modo per stampare il numero di riga dal file?

risposta

9

Quando la classe IO di Ruby apre un file, imposta la variabile globale $. su 0. Per ogni riga letta tale variabile viene incrementata. Quindi, per sapere quale linea è stata letta, basta usare $..

Cerca nel modulo English per $. o $INPUT_LINE_NUMBER.

Possiamo anche utilizzare il metodo lineno che fa parte della classe IO. Trovo che sia un po 'più complicato perché abbiamo bisogno di un oggetto flusso IO per attaccarlo, mentre $. funzionerà sempre.

che avrei scritto il ciclo più semplicemente:

File.foreach(ARGV[0]) do |line| 

Qualcosa a cui pensare è, se siete su un sistema * nix, è possibile utilizzare il sistema operativo del built-in grep o fgrep strumento per notevolmente velocizza la tua elaborazione. La famiglia di applicazioni "grep" è altamente ottimizzata per fare quello che vuoi, e può trovare tutte le occorrenze, solo la prima, può usare espressioni regolari o stringhe fisse, e può essere facilmente chiamata usando gli operatori %x o backtick di Ruby.

puts `grep -inm1 abacus /usr/share/dict/words` 

quali uscite:

34:abacus 

-inm1 significa "ignora carattere-case", "numeri di riga uscita", "stop dopo la prima occorrenza"

+0

Che funzionava benissimo! Grazie per l'aiuto Tin Man. Non ero a conoscenza del modulo inglese;) – nanotechz9l

+0

Sì, ho usato grep nel passato ma non per quello scopo, lo controllerò. Grazie anche per il taglio del ciclo. Sembra molto meglio! – nanotechz9l