Книга: Программирование на языке Ruby
14.9.2. Подача входных данных Ruby по конвейеру
14.9.2. Подача входных данных Ruby по конвейеру
Поскольку интерпретатор Ruby — это однопроходный транслятор, можно подать ему на вход некий код и выполнить его. Это может оказаться полезным, когда обстоятельства вынуждают вас работать на традиционном языке сценариев, но для каких-то сложных задач вы хотите применить Ruby.
В листинге 14.6 представлен bash-сценарий, который вызывает Ruby (посредством вложенного документа) для вычисления интервала в секундах между двумя моментами времени. Ruby-программа печатает на стандартный вывод одно значение, которое перехватывается вызывающим сценарием.
Листинг 14.6. bash-сценарий, вызывающий Ruby
#!/usr/bin/bash
# Для вычисления разницы в секундах между двумя моментами временами
# bash вызывает Ruby...
export time1="2007-04-02 15:56:12"
export time2="2007-12-08 12:03:19"
cat <<EOF | ruby | read elapsed
require "parsedate"
time1 = ENV["time1"]
time2 = ENV["time2"]
args1 = ParseDate.parsedate(time1)
args2 = ParseDate.parsedate(time2)
args1 = args1[0..5]
args2 = args2[0..5]
t1 = Time.local(*args1)
t2 = Time.local(*args2)
diff = t2 — t1
puts diff
EOF
echo "Прошло секунд = " $elapsed
В данном случае оба исходных значения передаются в виде переменных окружения (которые необходимо экспортировать). Строки, читающие эти значения, можно было бы записать так:
time1="$time1" # Включить переменные оболочки непосредственно
time2="$time2" # в строку...
Но возникающие при этом проблемы очевидны. Очень трудно понять, имеется ли в виду переменная bash или глобальная переменная Ruby. Возможна также путаница при экранировании и расстановке кавычек.
Флаг -e
позволяет создавать однострочные Ruby-сценарии. Вот пример обращения строки:
#!/usr/bin/bash
string="Francis Bacon"
ruby -e "puts '$string'.reverse" | read reversed
# $reversed теперь равно "nocaB sicnarF"
Знатоки UNIX заметят, что awk
использовался подобным образом с незапамятных времен.
- 14.9.4. Работает ли Ruby в интерактивном режиме?
- Глава 1. Обзор Ruby
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных
- ЧАСТЬ IV. База данных и ее объекты.
- Перевод базы данных InterBase 6.x на 3-й диалект
- Типы данных для работы с датой и временем
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Обзор основных причин повреждения базы данных