2014-10-30 64 views
2

如何在找到特定行後掃描文件。第一個結果不算。 例如(找到一條線,說: 「從這裏開始」 後,搜索3S):搜索並匹配字符串,僅在文件中的某個點後

Sample file 
1 
3 
3 
4 
begin here 
2 
3 
3 
1 
4 

預期產出將是兩個3S

+0

你能告訴我們你嘗試過什麼?對於我們來說修改/修復你的代碼比寫一些對你已經寫好的代碼沒有任何影響的東西更好,而且你必須把它放在原地。 – 2014-10-31 00:01:24

+0

看看Ruby的'..'(AKA觸發器)操作符。 「[什麼是觸發器操作符?](http://stackoverflow.com/questions/14456634/what-is-a-flip-flop-operator)」是你的朋友。 – 2014-10-31 00:08:15

+0

我意識到原來的問題不是很清楚。老實說,我想在文件中的某個點之後「掃描」,而不使用整個文本文件。我對此並不十分清楚。 – Flethuseo 2014-10-31 12:39:18

回答

4

Ruby的..運營商是你的朋友:

DATA.each_line do |line| 
    line.chomp! 
    next unless (line =~ /^begin here$/) .. false 
    puts line if line == '3' 
end 
__END__ 
1 
3 
3 
4 
begin here 
2 
3 
3 
1 
4 

保存該到一個文件並運行它,你會看到:

3 
3 

..(以及非常晦澀的...)來自Perl,對於這種特殊用途非常有用。

會發生什麼事是..是兩個國家的運營商與ifunless致力於尋找這是在這種情況下line =~ /^begin here$/第一條件。當滿足該條件時,操作員堅持,即返回真,直到第二個測試匹配(返回true)。一旦發生這種情況,觸發器就會再次開始返回false。

在這段代碼中,我在愚弄它,總是返回true,因爲第二個測試總是會是false。換句話說,代碼然後讀取到數據的末尾。

..(和...)是當你掃描文件,尋找在整個文件中出現的數據塊真的有用。如果第二個條件測試發現塊的末尾,則..將被重置,代碼將跳過該文件,直到找到下一個塊的開始,觸發並再次開始捕獲。


它也可能多數人沒見過用__END__DATA__END__是一種告訴Ruby,除此之外沒有其他代碼要執行的方式。 DATA是一個內部文件句柄,指向__END__後面的行,可以類似於IO和File對象處理。這對於爲腳本提供必須的數據非常有用,但不一定要放入單獨的文件中。在這種情況下,我假裝__END__之後的行是一個單獨的文件。十分簡單。

1

我會這樣寫。

代碼

def put3s(fname) 
    e = IO.foreach(FName) 
    until e.next.strip == "begin here"; end 
    loop { puts "3" if e.next.strip == "3" } 
end 

注意IO#foreach沒有一個塊返回一個枚舉。 foreach是你的最好的朋友。

到達枚舉數的最後一個元素後,e.next產生了StopIteration異常。 Kernel#loop通過跳出循環來處理異常。

我們首先創建一個文件:

text =<<_ 
1 
3 
3 
4 
begin here 
2 
3 
3 
1 
4 
_ 

FName = "t" 
File.write(FName, text) 

,然後執行方法

put3s(FName) 
    # 3 
    # 3 
相關問題