在最近的一周提示中,我们了解到当我们从命令行运行Ruby时可以使用-e 和-c 标志。Ruby还有很多我们可以使用的标志!(ruby --help 向我们展示了完整的标志列表。)今天值得注意的是,-n 和-p 标志都是将脚本包裹在循环中。
-n 在我们的脚本周围添加一个 循环。 读取用户的输入,并将其存储在一个 。因此,在我们的脚本周围添加一个 循环,使我们能够不断地读取用户的输入。如果没有 标志,如果我们要测试响应用户输入的代码片段,我们可能会在不同的手动测试案例中不断地重新运行它们。这个带有 标志的 循环对于测试代码片断特别有用,而不需要重新运行这些片断。while gets ... end gets $_ while gets -n -n while
如果使用Ruby脚本,与-n 标志一起使用的语法是ruby -n file.rb ,但对于单行代码,我们可以继续使用-e ,正如我们上周所探讨的。比如说:
$ ruby -ne 'puts "You said #{$_}"'
Hello there!
You said Hello there!
something else
You said something else
(注意,Hello there! 和something else 是用户输入的,而交织语句是打印输出。你也可以用管道输入其他数据,由这个循环来处理,例如用ls | ruby -ne 'puts "You said #{$_}"' ,然后为ls 返回的每个文件运行代码。)
像往常一样,我们可以使用control-D ,退出这个while 循环。
在-n 标志的基础上更进一步,-p 标志将把一个ruby文件包在一个while gets 循环中,同时也打印用户输入的内容。因此,使用与上面相同的小例子,我们可以做以下事情:
$ ruby -pe 'puts "You said #{$_}"'
Hello there!
You said Hello there!
Hello there!
something else
You said something else
something else
我们输入Hello there! 和something else ,Ruby执行我们的脚本,然后也再次打印我们的输入。这可能更方便,也许,当你想对输入的数据进行快速转换,然后让它再次输出,而不需要自己使用像puts 。
比如说:
$ echo "hello world" | ruby -pe '$_.upcase!'
HELLO WORLD
试着用上面的管道ls 的想法,看看会发生什么!