21

多亏了教程,我想我理解了触发器的工作原理,但是那里的示例只是为了教学而设计的。谁能举例说明您如何实际使用或将使用触发器?

我正在寻找一个真实的应用程序,而不仅仅是另一个演示。这个工具能解决什么问题?

该链接曾经是http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators,但现在似乎是垃圾邮件。

4

3 回答 3

20

这是一个示例(取自ruby​​central.com 文章),您只打印文件中的某些行:

file = File.open("ordinal")
while file.gets
    print if ($_ =~ /third/) .. ($_ =~ /fifth/)
end

这假设您有一个包含以下内容的文件:

first
second
third
fourth
fifth
sixth

该程序只会打印出:

third
fourth
fifth

这个想法是,它的值在左侧事件发生之前为真,然后在右侧事件发生之前保持为真。如果使用得当,这可能是一个很好的语法糖,但你需要小心让事情变得可读。

于 2009-07-10T18:48:33.763 回答
8

我想用一些具体的例子来补充詹姆斯的回答。我使用此运算符根据正则表达式提取文本部分。

我正在编写一个工具,该工具涉及通过 Net::SSH 在远程服务器上运行命令。无论会话是否是登录会话,这个特定的服务器都有打印 MOTD 的烦人习惯。这导致当我运行命令并检索输出时会返回大量垃圾。由于我对服务器设置没有太多影响,因此我创建了一个打印出分隔符的小脚本,运行程序,然后打印另一个分隔符。输出看起来像这样。

Welcome to Server X!

+----------------------------------------------------------------------+
| Use of this server is restricted to authorized users only. User      |
| activity may be monitored and disclosed to law enforcement personnel |
| if any possible criminal activity is detected.                       |
+----------------------------------------------------------------------+

----------------------------------------------
    Setting up environment for user Adam. 
----------------------------------------------

>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<

触发器操作符是一个有用的快捷方式,可以只提取包含我需要的输出的代码部分。我使用匹配 25 个大于“>”的正则表达式开始匹配,使用 25 个小于“<”来结束匹配。

output.each { |line| puts line if line[/^>{25}/] .. line[/^<{25}/] }

输出

>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<

我见过的大多数示例都涉及基于正则表达式从文件或数组中提取数据块。想到的其他一些示例包括 git 合并冲突、遗留平面文件系统中的某些记录(如写入文件的结构)和日志文件。

基本上,任何时候您都需要根据开始和结束数据提取部分,而不仅仅是单个行的内容。它比简单的正则表达式要复杂一些,但比编写解析器要简单。

于 2013-01-30T20:09:08.507 回答
4

在具有多行的 HTML 表格中突出显示奇数/偶数行似乎是一个有效的用例。

过去在 Rails 中渲染表格时,我曾多次写过一些不如上述优雅的东西。

于 2011-07-18T03:16:12.007 回答