2013-07-05 25 views
0

試圖在命令行中多行輸入讀取數據時,我下面的建議from this question時:怪異的行爲改變行分隔符,然後改變它回到

# change line separator 
$/ = 'END' 
answer = gets 
pp answer 

不過,我從STDIN#gets時怪異的行爲我試圖改變$/回:

# put it back to normal 
$/ = "\n" 
answer = gets 
pp answer 
pp 'magic' 

時使用Ruby執行這將產生輸出這樣的:

 
$ ruby multiline_input_test.rb 
this is 
     a multiline 
    awesome input string 
         FTW!! 
END 
"this is\n\ta multiline\n awesome input string\n   \t\tFTW!!\t\nEND" 
"\n" 
"magic" 

(I輸入到END,其餘是由程序輸出,然後程序退出。)

它不會停下來從用戶獲取輸入更改$/後回"\n"。所以我的問題很簡單:爲什麼?

作爲一個更大(但仍然很小)的應用程序的一部分,我試圖設計一種記錄筆記的方式;就像這樣,這種奇怪的行爲可能具有破壞性,因爲如果我無法重置行分隔符,那麼我的程序的其餘部分將無法正常工作。我嘗試過所有使用雙引號和單引號的方式,但這似乎不是問題。有任何想法嗎?

+0

您上次的代碼塊描述不清晰。哪部分是代碼,哪部分是用戶輸入,哪部分是響應? – sawa

+0

@sawa對不起。我提供的代碼片段是我在'multiline_input_test.rb'內執行的所有代碼。當它被執行時,它暫停,等待用戶輸入。我輸入「這是一個多行真棒輸入字符串FTW !!」 (隨機空白),然後輸入'END'。剩下的就是打印出來的內容:執行第二個'從我的代碼中獲取'時沒有其他停頓。 – DesAdams

+0

它看起來像第二個'gets'只是返回一個我從未輸入的換行符 – DesAdams

回答

3

您遇到的問題是您的輸入以END\n結尾。 Ruby看到END,並且緩衝區中還剩下一個\n。您成功地將輸入記錄分隔符重新設置回\n,以便字符立即被第二個gets消耗。

因此,你有兩個簡單的選擇:

  1. 設置輸入記錄分隔符END\n(用雙引號,纔能有換行符工作):

    $/ = "END\n" 
    
  2. 清除緩衝區撥打gets的額外電話:

    $/ = 'END' 
    answer = gets 
    gets # Consume extra `\n` 
    

我認爲選項1更清晰。

這說明它的工作使用選項1我的系統上:

 
$ ruby multiline_input_test.rb 
this is 
     a multiline 
    awesome input string 
         FTW!! 
END 
"this is\n  a multiline\n awesome input string\n      FTW!!\nEND\n" 
test 
"test\n" 
"magic" 
+0

啊,謝謝!我相信你爲我節省了很多調試時間。這非常合理,我已經按照沖洗緩衝區的思路思考了一些事情,但我也認爲你的第一選擇是更好的選擇。 – DesAdams

+0

感謝您對我的問題進行編輯,btw :)清晰度總是很重要。 – DesAdams

+0

@DesAdams不客氣,歡迎您! –