2013-10-04 32 views
6

Jestem obecnie otwierania pliku podjętą w czasie wykonywania przez ARGV:Jak wydrukować numer wiersza pliku, z którym pracuję za pomocą ARGV?

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

Gdy zostanie znaleziony wydrukować dane wyjściowe do użytkownika.

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 

Chcę wiedzieć, jak wydrukować numer wiersza dla pasującej linii w pliku (ARGV [0]).

Używanie print __LINE__ pokazuje numer wiersza ze skryptu Ruby. Próbowałem wiele różnych wersji print __LINE__ z różnymi interpolacjami ciągów #{line} bez powodzenia. Czy istnieje sposób, w jaki mogę wydrukować numer linii z pliku?

Odpowiedz

9

Kiedy klasa IO Ruby otwiera plik, ustawia globalną zmienną $. na 0. Dla każdej przeczytanej linii wartość jest zwiększana. Aby wiedzieć, która linia została przeczytana, po prostu użyj $..

Sprawdź w module English dla $. lub $INPUT_LINE_NUMBER.

Możemy również użyć metody lineno, która jest częścią klasy IO. Uważam, że jest nieco bardziej zawiłe, ponieważ potrzebujemy obiektu strumienia IO, aby go przypiąć, podczas gdy $. będzie działał zawsze.

bym napisać pętlę prościej:

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

coś do myślenia to, że jeśli jesteś na systemie * nix, można użyć wbudowanego OS w grep lub fgrep narzędzie znacznie przyspieszyć przetwarzanie. Rodzina aplikacji "grep" jest wysoce zoptymalizowana do robienia tego, co chcesz, i może znaleźć wszystkie wystąpienia, tylko pierwsza, może używać wyrażeń regularnych lub stałych ciągów i może być łatwo wywoływana za pomocą operatorów Ruby %x lub backtick.

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

które wyjścia:

34:abacus 

-inm1 oznacza "ignoruj ​​character-przypadek", "Numery linii wyjście", "stop po pierwszym wystąpieniu"

+0

To było wspaniałe! Dzięki za pomoc Tin Man. Nie wiedziałem o angielskim module;) – nanotechz9l

+0

Yup Użyłem grep w przeszłości, ale nie w tym celu, sprawdzę to. Dziękuję również za przycięcie w dół pętli. Wygląda o wiele lepiej! – nanotechz9l