0

尝试从命令行读取多行输入时,我遵循了这个问题的建议:

# 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
这是
        多行
  很棒的输入字符串
                        FTW!
结尾
"这是\n\ta 多行\n 很棒的输入字符串\n \t\tFTW!!\t\nEND"
"\n"
“魔法”

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

在我改$/"\n". 所以我的问题很简单:为什么?

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

4

1 回答 1

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
这是
        多行
  很棒的输入字符串
                        FTW!
结尾
"这是\n 多行\n 很棒的输入字符串\n FTW!!\nEND\n"
测试
“测试\n”
“魔法”
于 2013-07-05T05:01:27.133 回答