【问题标题】:Most reliable way to get text into ruby script将文本转换为 ruby​​ 脚本的最可靠方法
【发布时间】:2013-12-03 19:49:58
【问题描述】:

我有一个 ruby​​ 脚本,可以进行一些文本解析(à lá markdown)。它按一系列步骤完成,例如

string = string.gsub # more code here
string = string.gsub # more code here
# and so on

首先将文本输入string 的最佳(即最可靠)方法是什么?它是一个脚本,它所输入的文本可能会有很大的不同——它可以是多语言的,有一些字符可能会触发 shell(比如"'&、@987654327 @你明白了),并且可能是多行的。

上面有什么技巧吗

cat << EOF
bunch of text here
EOF

其他注意事项

我不是在寻找降价解析器,这是我想做的事情,而不是我想要的工具。

我不是ruby的大用户(我开始使用它),所以你能提供的答案越详细越好。

它必须是完全可编写脚本的(即,向用户询问信息时不会中断)。

【问题讨论】:

  • “可靠”是什么意思?
  • 可以处理奇怪/不可预测的字符,例如可能被 shell 解释的字符。
  • Ruby 可以毫无问题地处理这些问题。您的问题出在外壳上,而不是 Ruby 上。如果你手动在 shell 中输入文本,你应该知道输入了什么。

标签: ruby arguments argument-passing


【解决方案1】:

Kernel#gets 方法将从标准输入或命令行上指定的文件中读取使用记录分隔符分隔的字符串。因此,如果您使用它,您可以执行以下操作:

yourscript <filename #read from filename
yourscript file1 file2 # read both file1 and file2
yourscript  #lets you type at your script

所以要运行类似的东西:

cat <<'eof' |ruby yourscript.rb
This' & will $all 'eof' be 'fine'''
eof

脚本可能包含以下内容:

s = gets() # read a line
lines = readlines() # read all lines into an array

这对于命令行脚本来说是相当标准的。如果你想要一个用户界面,那么你会想要更复杂的东西。 Ruby 解释器有一个选项可以在读取文件时设置文件的编码。

【讨论】:

  • 我需要更多关于如何完成的细节,拜托(我已经更新了问题)。
  • 我希望这就足够了
  • 它仍然没有考虑到一些边缘情况(如反引号),但我怀疑我们会得到更好的东西——我已经要求最可靠的解决方案,不是防弹(可能不存在)。
【解决方案2】:

仅来自标准输入的read(这是一个IO 对象):

$stdin.read

如您所见,标准输入在全局变量$stdin 中提供。由于它是一个IO 对象,如果read 不适合您的需求,则有a lot of other methods available

这是一个简单的 shell 中的单行示例:

$ echo "foo\nbar" | ruby -e 'puts $stdin.read.upcase'
FOO
BAR

显然,从标准输入读取非常灵活,因为您可以从任何地方通过管道输入。

【讨论】:

  • 如果不知道会通过什么文本,也是极不可靠的。
  • @user137369 一点也不。你为什么这么认为?
  • @user137369 另请参阅我对问题本身的评论。
【解决方案3】:

Ruby 非常擅长编码(参见例如Encoding docs)。要将文本输入 Ruby,通常使用gets,或读取File 对象,或使用可以使用gtk2 gem 或rugui 构建的GUI(如果已经完成)。如果您从狂野的互联网上获取文本,则应该关注安全性。 Ruby 曾经有 4 个$SAFE 级别,但经过一些讨论,现在可能只剩下 3 个了。无论如何,处理字符串的最佳策略是尽可能多地了解您预先期望的字符串的属性。处理绝对任意字符串是一项非常困难的任务。尝试限制可能的编码数量并计算出您期望的字符串的最大大小。

此外,关于您最初声明的目标,即编写类似降价处理器的东西,您可能不想重新发明轮子(除非它是出于教学目的)。有这样的帖子: Better ruby markdown interpreter?

答案将引导你到kramdowngem,虽然我没有亲自尝试过,但得到了很多好评。

【讨论】:

  • “无论如何,处理字符串的最佳策略是尽可能多地了解你所期望的字符串的属性”。根本不是一个选择。不过,我已经用更多细节更新了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多