.. 或触发器是从 Perl 继承的,Perl 从 AWK 获得它并在 *nix 中使用 sed。它非常强大,但在您的特定用途中它相当晦涩,对于您想要的逻辑来说不是一个好的选择,尤其是在 Ruby 中。而是使用:
(1..10).each {|x| puts x if (3..5) === x }
哪些输出:
3
4
5
也就是说,当您需要从文件中提取一系列行时,它非常强大:
File.foreach('/usr/share/dict/propernames') { |li| puts li if ($. == 5 .. $. == 7) }
哪些输出:
Agatha
Ahmed
Ahmet
Perl 允许使用仅使用当前读取行的行号(AKA $.)的更简洁的表达式,但 Ruby 不支持。
还有使用正则表达式的选项,其行为与之前的比较类似:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (li[/^Wa/] .. li[/^We/]) }
哪些输出:
Wade
Walt
Walter
Warren
Wayne
Wendell
由于正则表达式有效,因此可以创建一个复杂的模式来根据匹配从文件中检索行。作为第一个,然后是第二个模式触发,线被捕获。如果稍后在文件中,另一行触发了第一个模式,则捕获将再次发生,直到第二个模式匹配。它非常强大:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (
li[/^Am/] .. li[/^An/] or
li[/^Wa/] .. li[/^We/]
)
}
哪些输出:
Amanda
Amarth
Amedeo
Ami
Amigo
Amir
Amos
Amy
Anatole
Wade
Walt
Walter
Warren
Wayne
Wendell
或者,对于我们会说晦涩代码的朋友:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (li[/^(?:Am|Wa)/] .. li[/^(?:An|We)/]) }