与Ruby命令行开关混淆“-p”

时间:2013-02-13 19:44:47

标签: ruby ruby-1.9.3

-p ==>假设循环像-n但打印行也像sed。

现在我在下面尝试了解它是如何工作的:

@ubuntu:~$ ruby -p
hi #<~~ pressed on ENTER
   # nothing printed baack 
\t
-:5: syntax error, unexpected $undefined, expecting $end
@ubuntu:~$

在上面输入“hi”后,当我按下“ENTER”时,如上所述得到 空行 。我认为它会输出 hi

现在我尝试了一下方式:

@ubuntu:~$ ruby -p -e '"hi"'
hi  #<~~ pressed on ENTER
hi
ttt #<~~ pressed on ENTER
ttt
\t  #<~~ pressed on ENTER
\t
EOF #<~~ pressed on ENTER
EOF

但是这里似乎-p按预期工作。但Loop属于无限Loop。我试过EOF来完成这个循环,但是没有发生,而是它也被打印出来了。

任何人都可以帮助我理解为什么会有这些差异吗?

2 个答案:

答案 0 :(得分:1)

-p会:

- Read a line from input
- Pass the input to the code
- If the code executes successfully, print the input

如果您没有在命令行中提供文件名或-e,它将只使用标准输入而不执行任何操作。 -p无法打印,因为未提供任何代码。

当您刚放-pe '"hi"'时,每次输入一行(但它在内存中但没有输出)时它会生成一个hi字符串,并打印为-p指示。

您输入的

EOF不是EOF指标。它是一个字符串"EOF"。如果要向红宝石发送EOF信号,请按Ctrl+Z并按Enter

答案 1 :(得分:0)

您首先尝试失败,因为如果没有程序,解释器将读取标准输入直到EOF。所以,你处于令人困惑的情况 first 需要从标准输入输入一个程序,然后是^ D或你控制台上的任何EOF,然后然后你的程序启动,它将再次读取标准输入 以实现固定循环。

在第二种情况下,您至少要避免使用双标准输入snarf。而且它并不是一个无限循环,当你输入EOF时它会完成。