更改行分隔符然后将其更改回来时的奇怪行为

时间:2013-07-05 04:17:40

标签: ruby multiline gets

在尝试从命令行读取多行输入时,我正在遵循建议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"

(我输入END,其余的由程序输出,然后程序退出。)

我将$/更改回"\n"后,不会暂停以获取用户的输入。所以我的问题很简单:为什么?

作为更大(但仍然很小)的应用程序的一部分,我正在尝试设计一种记录笔记的方法;事实上,这种奇怪的行为可能是毁灭性的,因为如果我无法重置行分隔符,我的程序的其余部分将无法正常运行。我尝试过使用双引号和单引号的各种方式,但这似乎不是问题。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您遇到的问题是您的输入以END\n结尾。 Ruby看到END,缓冲区中还剩下\n。您执行成功将输入记录分隔符设置回\n,以便第二个gets立即使用该字符。

因此,您有两个简单的选择:

  1. 将输入记录分隔符设置为END\n(使用双引号以使换行符符号有效):

    $/ = "END\n"
    
  2. 通过额外调用gets清除缓冲区:

    $/ = 'END'
    answer = gets
    gets # Consume extra `\n`
    
  3. 我认为选项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"