2017-02-22 86 views
5

man頁:什麼是ruby -a命令行開關?

-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. 

一些問題浮現在腦海中:當-a而不-n-p使用

  • 會發生什麼?
  • 什麼是$F
  • 循環結束時會發生什麼?
  • 如何控制將哪個字符選爲split
  • -a打算如何使用?

從另一個reference page

$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. 

我仍然不知道-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) 

回答

4

自動分割模式與-a開關啓用。它啓用awk默認執行的那種文本處理。根據字段分隔

  1. 自動分割線,$_,成字段(:
    在自動分配模式,紅寶石將讀取作爲參數或在時間stdin 一行文件,並且對於每個線由-F標誌指定)
  2. 結果賦給名爲$F
  3. 變量不經由命令行提供的動作。

處理所有行後,程序退出或執行END block。看到這個答案爲example

自動分配模式是用於與具有許多recordsrecords是線,除非record separator被改變)片狀的文本文件和在每行若干分隔fields的工作是有用的。 例如,考慮與內容的file

ADG:YUF:TGH 
UIY:POG:YTH 
GHJUR:HJKL:GHKIO 

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

$ ruby -F: -a -n -e 'puts $F[2]' file 
TGH 
YTH 
GHKIO 

在這種情況下,-F:字段分隔符設置爲:$F是在記錄($_)被拆分後字段存在的數組。 -e之後的操作在每行被分割後執行。

ruby cli交換機與perl的交換機非常相似。 perl cli使該功能更加方便,請參見perldoc perlrun。例如,由於-a在沒有-n(或-p)的情況下無效,因此在perl,-F中隱含地啓用-a,其繼而啓用-nruby不是這種情況,所有的交換機都必須明確通過。 有關使用此類處理可以完成的好事情的示例,請查找awk one liners

此外,ruby CLI如下UNIX約定用於使command-line options

傳統上,UNIX命令行選項由短劃線,接着一個或多個小寫字母。

所以-a-nswitches-eflag可以組合來達到相同的結果:

$ ruby -F: -ane 'puts $F[2]' file 
TGH 
YTH 
GHKIO 

如果這是有趣的,看看一些其他的ruby one liners.