Ruby имеет параметр -e
, который полезен при предоставлении коротких кодов:
:!ruby -e 'puts $_.split("|").map(&:to_i).map { |no| no*2 }.join("|") while gets'
Если вы хотите выполнить код только для одной строки, вы можете пропустить while -l oop:
:!ruby -e 'puts gets.split("|").map(&:to_i).map { |no| no*2 }.join("|")'
При выполнении команды терминала выбранные строки отправляются на него в качестве стандартного ввода. gets
будет читать из стандартного ввода.
Документация Kernel#gets
:
получает (sep = $ / [, getline_args]) → строка или ноль клик, чтобы переключить источник Возвращает ( и присваивает $_
) следующую строку из списка файлов в ARGV
(или $*
), или из стандартного ввода, если в командной строке нет файлов . Возвращает nil
в конце файла. Необязательный аргумент указывает разделитель записей. Разделитель включен с содержанием каждой записи. Разделитель nil
считывает все содержимое, а разделитель нулевой длины - вводит один абзац за раз, когда абзацы разделяются двумя последовательными символами новой строки. Если первый аргумент является целым числом или задан необязательный второй аргумент, возвращаемая строка не будет длиннее заданного значения в байтах. Если в ARGV
присутствует несколько имен файлов, gets(nil)
будет считывать содержимое по одному файлу за раз. ARGV << "testfile"
print while gets
создает: This is line one
This is line two
This is line three
And so on...
стиль программирования с использованием $_
в качестве неявного параметра постепенно теряет популярность в сообществе Ruby.
Вы можете сократить вышеприведенное, используя флаг -p
или -n
, который переносит код внутри while gets
l oop:
:!ruby -ne 'puts $_.split("|").map(&:to_i).map { |no| no*2 }.join("|")'
или
:!ruby -pe '$_ = $_.split("|").map(&:to_i).map { |no| no*2 }.join("|")'
со страницы man ruby
:
-n Causes Ruby to assume the following loop around your
script, which makes it iterate over file name arguments
somewhat like sed -n or awk.
while gets
...
end
-p Acts mostly same as -n switch, but print the value of
variable $_ at the each end of the loop. For example:
% echo matz | ruby -p -e '$_.tr! "a-z", "A-Z"'
MATZ