2013-10-04 39 views
6

Şu anda ARGV aracılığıyla zamanında alınan bir dosyayı açıyorum.Çalıştığım dosyanın satır numarasını ARGV aracılığıyla nasıl yazdırırım? Bir maç Ben kullanıcıya çıktı yazdırmak bulunduğu anda</p> <pre><code>File.open(ARGV[0]) do |f| f.each_line do |line| </code></pre> <p>:

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 

I (ARGV [0]) dosyasında eşleme hattı için hat numarasını yazdırmak için nasıl bilmek istiyorum. print __LINE__ kullanma

Yakut komut satırı sayısını gösterir. print __LINE__'un birçok farklı varyasyonunu, #{line}'un farklı dize enterpolasyonları ile denedim. Dosyadan satır numarasını yazmanın bir yolu var mı? Ruby'nin IO sınıf bir dosyayı açtığında

cevap

9

, bu değişken artırılır olduğu okunduğunda her satır için 0'a $. küresel değişkeni ayarlar. Yani, hangi satırın okunduğunu öğrenmek için $.'u kullanın.

$. veya $INPUT_LINE_NUMBER için English modülüne bakın.

Biz de IO sınıfının bir parçası olan lineno yöntemi kullanabilirsiniz. Bunu biraz daha kıvrımlı buluyoruz çünkü bir IO akış nesnesine ihtiyacımız var, buna rağmen $. her zaman çalışacak.

Ben daha basit döngü yazmak istiyorum: yaklaşık is düşünmeye

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

şey bir * Nix sistemde iseniz, kullanabileceğiniz işletim sistemleri dahili grep veya fgrep aracı büyük ölçüde etmek işleminizi hızlandırın. "Grep" uygulama ailesi, istediğiniz şeyi yapmak için son derece optimize edilmiştir ve tüm oluşumları bulabilir, yalnızca birincisi, normal ifadeleri veya sabit dizeleri kullanabilir ve Ruby'nin %x veya backtick operatörlerini kullanarak kolayca çağrılabilir.

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

verir Hangi:

34:abacus 

-inm1, "çıkış hattı numaraları" "karakter harf görmezden" büyük çalıştı

+0

"ilk geçtiği sonra dur" demektir! Teneke Adam için teşekkürler. İngilizce modülün farkında değildim;) – nanotechz9l

+0

Yup Geçmişte grep kullandım ama bu amaçla değil, kontrol edeceğim. Ayrıca döngüyü kırptığınız için teşekkürler. Çok daha iyi görünüyor! – nanotechz9l