什么是ruby -a命令行开关?

mbi*_*ras 5 ruby string command-line

手册页:

 -a     Turns on auto-split mode when used with -n or -p.
        In auto-split mode, Ruby executes
              $F = $_.split
        at beginning of each loop.
Run Code Online (Sandbox Code Playgroud)

有些问题浮现在脑海中:

  • 会发生什么情况-a,而不使用-n-p
  • 什么是$F
  • 循环结束时会发生什么?
  • 如何控制选择哪个角色split
  • 如何-a使用?

从另一个参考页面:

$F      The variable that receives the output from split when -a is specified.
        This variable is set if the -a command-line option is specified
        along with the -p or -n option.
Run Code Online (Sandbox Code Playgroud)

我还不确定是什么-a开关.会很感激解释,但会更多地欣赏一些例子.

我试过的一些事情:

$ echo foo_bar_bar | ruby -ae
ruby: no code specified for -e (RuntimeError)
$ echo foo_bar_bar | ruby -ap
$ echo foo_bar_bar | ruby -ap '$_'
ruby: No such file or directory -- $_ (LoadError)
Run Code Online (Sandbox Code Playgroud)

pii*_*_ke 5

通过开关启用自动分割模式-a。它支持默认情况下进行的文本处理awk
在自动分割模式下,Ruby 将读取作为参数给出的文件或stdin 一次一行,并且对于每一行:

  1. $_根据字段分隔符(由-F标志指定)自动将行 , 拆分为字段
  2. 将结果分配给名为的变量$F
  3. 执行通过命令行提供的操作。

处理完所有行后,程序退出或执行END。请参阅此答案的示例

自动分割模式对于处理具有很多行recordsrecords除非更改记录分隔符是行)并且每行中有多个分隔符的表格文本文件非常有用fields。例如,考虑一个file内容:

ADG:YUF:TGH
UIY:POG:YTH
GHJUR:HJKL:GHKIO
Run Code Online (Sandbox Code Playgroud)

然后ruby -F: -a -n -e 'puts $F[2]' file打印每行的第三个字段:

$ ruby -F: -a -n -e 'puts $F[2]' file
TGH
YTH
GHKIO
Run Code Online (Sandbox Code Playgroud)

在这种情况下,-F:将字段分隔符设置为:。是 record ( ) 分割$F后字段所在的数组。分割后的每一行都会执行$_后面的操作。-e

cliruby开关与perl. cliperl使此功能更加方便,请参阅perldoc perlrun。例如,since 在没有(或)的情况-a下没有用,在,中隐式启用,这反过来又启用。情况并非如此,所有开关都必须显式传递。有关可以通过这种处理完成的好事情的示例,请查找一个衬垫-n-pperl-F-a-nrubyawk

此外,rubycli 遵循传递命令行选项的unix 约定:

传统上,UNIX 命令行选项由破折号后跟一个或多个小写字母组成。

因此可以将-aand-n 开关-e 标志组合起来以获得相同的结果:

$ ruby -F: -ane 'puts $F[2]' file
TGH
YTH
GHKIO
Run Code Online (Sandbox Code Playgroud)

如果这很有趣,请查看其他一些ruby衬里。