多行输入的 Ruby 'gets' 函数

13

在使用 IRB 时,我想输入一个多行字符串以从中删除某些字符。"gets" 只允许单行输入 - 是否有类似于多行输入的函数。


在IRB中,我希望输入一个多行字符串以便从中删除某些字符。"gets"只能接受单行输入,是否有类似于多行输入的函数?
ASCII_project.rb(main):002:0* puts = "What's the text you want to strip?"
=> "What's the text you want to strip?"
ASCII_project.rb(main):003:0> str = gets

我现在想粘贴一段文字 - 由于有换行符,它无法正常工作。这就是为什么我想要跨多行收集的原因。

下面是代码

# encoding: CP850
puts = "What's the text you want to strip?"
str = gets
str.gsub!(/\P{ASCII}/, '')
puts str

嗯,只是多次调用gets函数吗? - SirDarius
如果不是通过换行符,那么该方法如何知道何时停止阅读? - Michał Kwiatkowski
4个回答

10

您可以使用此方法,它接受文本直到第一个空行。

def multi_gets all_text=""
  while (text = gets) != "\n"
    all_text << text
  end
  all_text
end

对于这个例子,您可以将 \n\n 替换为您定义的任何结束字符。

def multi_gets all_text=""
  while all_text << STDIN.gets
    return all_text if all_text["\n\n"]
  end
end

1
这是终止字符处理的良好封装。 - New Alexandria

9
您可以像这样在$stdin上使用readlines()
> $stdin.readlines
Mit Wohnungen, mit Bergen, Hügeln, Flüssen,
Solang ichs deutlich sah, ein Schatz der Freuden;
Zuletzt im Blauen blieb ein Augenweiden
An fernentwichnen lichten Finsternissen.

# ^D
 => ["Mit Wohnungen, mit Bergen, Hügeln, Flüssen,\n",
 "Solang ichs deutlich sah, ein Schatz der Freuden;\n",
 "Zuletzt im Blauen blieb ein Augenweiden\n",
 "An fernentwichnen lichten Finsternissen.\n"]

你的示例代码使用了错误的标准输入变量名称。我本来想编辑它,但它低于6个字符的限制。 - Will
@Will 谢谢,那个被忽略了。 - Konrad Reiche

9
您可以按照以下方式进行操作:
$/ = "END"  
user_input = STDIN.gets
puts user_input

当您认为输入已完成时,请务必键入END关键字,

同时,此方法仅适用于实际解释器而不是irb。


2
这是Ruby中唯一可行的解决方案。 - New Alexandria
你能解释一下 $/ 的作用吗? - Joseph
@Joseph,那是Ruby的全局变量,用作gets和readline的分隔符。 - maximus ツ

-4
str = <<-EOF
Your multi line
text goes here
.....
EOF

但是问题在于你必须以EOF结尾


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接