在尝试从命令行读取多行输入时,我正在遵循建议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"
后,不会暂停以获取用户的输入。所以我的问题很简单:为什么?
作为更大(但仍然很小)的应用程序的一部分,我正在尝试设计一种记录笔记的方法;事实上,这种奇怪的行为可能是毁灭性的,因为如果我无法重置行分隔符,我的程序的其余部分将无法正常运行。我尝试过使用双引号和单引号的各种方式,但这似乎不是问题。有什么想法吗?
答案 0 :(得分:3)
您遇到的问题是您的输入以END\n
结尾。 Ruby看到END
,缓冲区中还剩下\n
。您执行成功将输入记录分隔符设置回\n
,以便第二个gets
立即使用该字符。
因此,您有两个简单的选择:
将输入记录分隔符设置为END\n
(使用双引号以使换行符符号有效):
$/ = "END\n"
通过额外调用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"