新手问题 ruby 读取大段文本

lufeihaidao · 2013年03月14日 · 最后由 metal 回复于 2013年03月15日 · 4789 次阅读

新手。做题目的时候试着用 ruby 读取大段文本。我是在 pry 中尝试的。首先尝试用 gets,理所当然的失败了,因为大段文本中含有换行符。搜了下,发现可以这样:gets = <<'EOF',然后结束的时候输入EOF就行了。但是我发现复制的一大段文本只粘贴了一小部分。后来看到可以 ARGF.read,但是我输入之后不知道如何结束输入,请问用 ARGF 读取字符串的方法

追加问题: 我在编辑器中进行了。 在 python 里可以用三个引号扩起包括换行符的字符串,ruby 也可以,但似乎不太一样:这段字符串包含许多特殊字符,大中小括号啊什么的,ruby 会出错(我猜是 ruby 进入字符串判断括号的匹配了?),而 python 不会出错。 在编辑器中,使用= <<'EOF'的方法是可以正确读取字符串的。请问 ruby 这几种读取多行字符串的区别?

ruby 没有三引号的, 只是和 C 一样, 相邻的字符串会被自动拼接起来

'''a string'''
# 其实相当于:
'' + 'a string' + ''
# 注意这个拼接只对字符串字面量有效

ruby 的双引号和单引号都能放进多行字符串, 双引号里可以用各种反斜线转义或者代入, 单引号里只有两种转义: \\\' .

ARGF.read 结束输入流的方式是输入 EOF, 在 windows 是 ctrl+z, 在 mac 和 linux 是 ctrl+d (如果按了键没有结束的话, 先回车一下再试试). 或者你把字符串存到一个文本文件里, 放在第一个参数里也能用 ARGF.read 读取: ruby some.rb 文本文件名.

ARGF.readline #=> "This is line one\n"

某本书上说,这个,貌似是高效的

我刚刚用 gets = <<'EOF' EOF

把 sinatra 的 main.rb 全部打印了。 https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb

gets.size
=> 62519

非常感谢 @luikore ,我一直以为 EOF 结尾就是在字符串的最后输入 EOF,没想到是输入 ctrl + d,这样的话,ARGF.read 直接读字符串和读文件都没有问题。

@metal 我看了你给的文件。请看这个网址:www.pythonchallenge.com/pc/def/ocr.html

我要处理的 html 源代码注释里的一大段文本。但是直接在 pry 里确实不能正确读入,在文本编辑器中写入再执行是可以的。我试了你给的文本,在交互程序里都只能粘贴几百行,在编辑器里则可以粘贴完全:数千行(这是我在交互程序里失败的最主要的原因:复制的内容不能完全粘贴过来)。原因我也不清楚,也许因为 irb/pry 限制了单次输入的最大字符个数?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册