Чтение онлайн

на главную - закладки

Жанры

Программирование на языке 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, в которой информация представляется по-разному на разных уровнях протоколов.

Но в каком бы формате данные ни хранились, рано или поздно их придется читать, разбирать и снова сохранять. В этой главе мы рассмотрим лишь несколько самых распространенных форматов файлов; в одной книге невозможно охватить все существующие. Если вы хотите разбирать файлы в таких форматах, как vCard, iCal и пр., то придется поискать соответствующие библиотеки или, быть может, написать свою собственную.

Поделиться:
Популярные книги

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

#Бояръ-Аниме. Газлайтер. Том 24

Володин Григорий Григорьевич
24. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 24

Лихие. Смотрящий

Вязовский Алексей
2. Бригадир
Фантастика:
попаданцы
5.00
рейтинг книги
Лихие. Смотрящий

Хозяин оков VI

Матисов Павел
6. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков VI

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Бастард Императора. Том 10

Орлов Андрей Юрьевич
10. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 10

Ярар. Начало

Грехов Тимофей
1. Ярар
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ярар. Начало

Седьмой Рубеж IV

Бор Жорж
4. 5000 лет темноты
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Седьмой Рубеж IV

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Прайм. Хомори

Бор Жорж
2. Легенда
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Прайм. Хомори

Газлайтер. Том 28

Володин Григорий Григорьевич
28. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 28

Темная сторона. Том 2

Лисина Александра
10. Гибрид
Фантастика:
технофэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Темная сторона. Том 2

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Лекарь Империи 10

Карелин Сергей Витальевич
10. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 10