Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
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.3. Получение и установка кодов завершения
Метод exit
возбуждает исключение SystemExit
и в конечном счете возвращает указанный код завершения операционной системе (или тому, кто его вызвал). Этот метод определен в модуле Kernel
. Метод exit!
отличается от него в двух отношениях: он не выполняет зарегистрированные обработчики завершения и по умолчанию возвращает -1.
# ...
if (all_OK)
exit # Нормально (0).
else
exit! # В спешке (-1).
end
Когда операционная система печатает возвращенный Ruby код (например, выполнив команду echo $?
), мы видим то же самое число, что было указано в программе. Если завершается дочерний процесс, то код его завершения, полученный с помощью метода wait2
(или waitpid2
), будет сдвинут влево на восемь битов. Это причуда стандарта POSIX, которую Ruby унаследовал.
child = fork { sleep 1; exit 3 }
pid, code = Process.wait2 # [12554,768]
status = code << 8 #3
14.9.4. Работает ли Ruby в интерактивном режиме?
Чтобы узнать, работает ли программа в интерактивном режиме, нужно проверить стандартный ввод. Метод isatty?
возвращает true
, если устройство интерактивное, а не диск или сокет. (Для Windows этот метод не реализован.)
if STDIN.isatty?
puts "Привет! Я вижу, вы печатаете"
puts "на клавиатуре."
else
puts "Входные данные поступают не с клавиатуры."
end
14.9.5. Определение текущей платформы или операционной системы
Если программа хочет знать, в какой операционной системе исполняется, то может опросить глобальную константу RUBY_PLATFORM
. В ответ будет возвращена загадочная строка (что-то вроде i386-cygwin
или sparc-solaris2.7
), содержащая информацию о платформе, для которой был собран интерпретатор Ruby.
Поскольку мы в основном работаем с вариантами UNIX (Solaris, AIX, Linux) и Windows (98, NT, 2000, XP), то считаем полезным следующий очень грубый код. Он отличает UNIX от Windows (бесцеремонно отправляя всех остальных в категорию «прочие»).
def os_family
case RUBY_PLATFORM
when /ix/i, /ux/i, /gnu/i,
/sysv/i, /solaris/i,
/sunos/i, /bsd/i
"unix"
when /win/i, /ming/i
"windows"
else
"other"
end
end
Этот небольшой набор регулярных выражений корректно распознает абсолютное большинство платформ. Конечно, это весьма неуклюжий способ обработки системных зависимостей. Даже если вы правильно определите семейство ОС, отсюда еще не следует, что нужная вам функциональность имеется (или отсутствует).
14.9.6. Модуль Etc
Модуль Etc
получает различную информацию из файлов /etc/passwd
и /etc/group
. Понятно, что полезен он только на платформе UNIX.
Метод getlogin
возвращает имя пользователя, от имени которого запущена программа. Если он завершается неудачно, может помочь метод getpwuid
(принимающий в качестве необязательного параметра идентификатор пользователя uid
).
myself = getlogin # hal9000
myname = getpwuid(2001).name # hal9000
# Если параметр не задан, getpwuid вызывает getuid...
me2 = getpwuid.name # hal9000
Метод getpwnam
возвращает структуру passwd
, которая содержит поля name
, dir
(начальный каталог), shell
(начальный интерпретатор команд) и др.
rootshell = getpwnam("root").shell # /sbin/sh
Методы getgrgid
и getgrnam
ведут себя аналогично, но по отношению к группам. Они возвращают структуру group
, содержащую имя группы и т.д.
Итератор passwd
обходит все записи в файле /etc/passwd
. Запись передается в блок в виде структуры passwd
.
all_users = []
passwd { |entry| all_users << entry.name }
Имеется также итератор group для обхода записей в файле /etc/group
.
14.10. Заключение
На этом мы завершаем обсуждение применения Ruby для решения рутинных задач автоматизации. Мы видели, как передавать в программу и получать от нее информацию в виде переменных окружения и с помощью стандартного ввода/вывода. Мы познакомились с типичными операциями «склеивания», позволяющими разным программам взаимодействовать. Рассмотрели мы и различные уровни взаимодействия с операционной системой.
Поскольку значительная часть изложенного материала системно зависима, я призываю вас экспериментировать. Между платформами Windows и UNIX имеются серьезные отличия. Есть они и между разными операционными системами, относящимися к одному семейству.
Следующая тема, которую мы рассмотрим, тоже весьма широка. Речь пойдет о работе с данными в разных форматах, от графических до XML.
Глава 15. Ruby и форматы данных
— Ваша информация, сэр, — говорит Библиотекарь.
— Сможешь увязать эту информацию с утилитой «ВЫ ЗДЕСЬ»? — говорит Хиро.
— Я посмотрю, что можно сделать, сэр. Форматы представляются совместимыми.
Нил Стивенсон, «Лавина»В этой главе мы расскажем обо всем понемножку. Значительную часть материала можно было бы поместить и в другое место. Не все рассмотренные вопросы одинаковы по важности и сложности, но каждому из них стоит уделить внимание.
В программировании так уж получается, что по мере усложнения какой-то информации для ее описания вырабатывается отдельный «мини-язык», а чаще даже несколько таких языков. Мы называем их форматами файлов или данных.
Любой из вас припомнит сотни примеров форматов файлов. Это и графические форматы типа JPG, GIF и PNG, и форматы документов (RTF и PDF), и «универсальные» форматы (CSV, XML или YAML) и бесчисленные форматы, разработанные отдельными компаниями, многие из которые являются просто вариациями на тему хранения данных в виде таблицы с фиксированной шириной колонок, столь популярного в древние времена (я имею в виду 1960-е годы).
Один из самых простых и наиболее употребительных форматов данных — обычный текст. Но даже на такой формат можно наложить ту или иную структуру (отсюда и популярность XML). Бывают также чисто двоичные и двоично-текстовые форматы. В принципе можно было бы разработать «иерархию» форматов, подобную сетевой модели ISO, в которой информация представляется по-разному на разных уровнях протоколов.
Читать дальшеИнтервал:
Закладка: