2013-07-05 26 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不客气,欢迎您! –