Ruby:为什么我在这里得到“正则表达式字面值”的警告?

时间:2015-03-20 10:34:01

标签: ruby

一个简单的Ruby程序,运行良好(使用Ruby 2.0.0):

#!/usr/bin/ruby
while gets
    print if /foo/../bar/
end

但是,Ruby还会输出警告警告:条件中的正则表达式文字。看来Ruby认为我的触发器表达式/foo/../bar/是危险的。

我的问题:这个计划的危险在哪里?并且:我可以关闭此警告(理想情况下仅针对此声明,保持其他警告处于活动状态)?

顺便说一下,我在网上发现了几种关于这种代码的讨论,也提到了警告,但从来没有找到一个很好的解释为什么我们会收到警告。

2 个答案:

答案 0 :(得分:5)

您可以使用明确匹配来避免警告:

while gets
  print if ~/foo/..~/bar/
end

Regexp#~$_匹配。

我不知道为什么显示警告(说实话,我甚至不知道Ruby隐式地将regexp文字与$_匹配),但是根据{ {3}},除非在调用Ruby时提供-e选项,否则会显示它,即将脚本作为参数传递:

$ ruby -e "while gets; print if /foo/../bar/ end"

我会避免使用$_作为隐式参数,而是使用类似:

的内容
while line = gets
  print line if line=~/foo/..line=~/bar/
end

答案 1 :(得分:0)

我认为Neil Slater是对的:它看起来像是解析器中的一个错误。如果我将代码更改为

#!/usr/bin/ruby
while gets
  print if $_=~/foo/..$_=~/bar/
end

警告消失。

我会提交错误报告。