2017-02-22 62 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 по умолчанию.
В автоматическом режиме разделенного, рубин будет читать файлы, указанные в качестве аргументов или stdin одна линии в то время, и для каждой строки:

  1. автоматически разделит линию, $_, в поля в соответствии с разделителем полей (обозначенный флагом -F)
  2. присваивает результат переменной с именем $F
  3. выполняет действия, предоставляемые через командную строку.

После того, как все строки обработаны, программа завершает или выполняет команду END block. См. Этот ответ для example.

Авто-сплит режим удобен для работы с табличными текстовыми файлами, которые имеют много records (records являются линиями, если 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 выполняются для каждой строки после ее разделения.

Коммутаторы cli ruby очень похожи на переключатели perl. perl cli делает эту функцию более удобной, см. perldoc perlrun. Например, поскольку -a не полезен без -n (или -p), в perl, -F неявно включает -a, что, в свою очередь, позволяет использовать -n. Это не относится к ruby, все коммутаторы должны быть явно переданы. Для примеров приятных вещей, которые можно сделать с помощью такого вида обработки, смотрите awk one liners.

Также ruby кли следует конвенции Unix для прохождения command-line options:

Традиционно UNIX параметры командной строки состоят из тире, за которым следует один или несколько строчных букв.

Так -a и -nswitches и -eflag могут быть объединены, чтобы достичь того же результата:

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

Если это интересно, проверить некоторые другие ruby one liners.