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

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

Жанры

Программирование на языке Ruby
Шрифт:

14.2.1. Разбор флагов в командной строке

Для разбора командной строки чаще всего применяется библиотека

getoptlong
(библиотека
getopts.rb
, обладающая менее развитой функциональностью, считается устаревшей). Она понимает однобуквенные и длинные флаги и распознает двойной дефис (
– -
) как признак конца флагов. В целом библиотека ведет себя так же, как соответствующие функции GNU.

Необходимо создать объект класса

GetoptLong
, который и будет выполнять функции анализатора. Затем ему передаются допустимые значения
флагов, а он извлекает их по одному.

У объекта-анализатора есть метод

set_options
, который принимает список массивов. Каждый массив содержит один или несколько флагов (в виде строк) и один «признак наличия аргумента», который говорит, должны ли эти флаги сопровождаться аргументами. Все флаги в одном массиве считаются синонимами; первый из них является «каноническим именем», которое и возвращает операция
get
.

Предположим, что имеется программа, понимающая следующие флаги:

– h
или
– -help
(печать справки),
– f
или
– -file
(указание имени файла),
– l
или
– -lines
(вывод не более указанного числа строк, по умолчанию 100).

Такая программа могла бы начинаться следующим образом:

require "getoptlong"

parser = GetoptLong.new

parser.set_options(

 ["-h", "--help", GetoptLong::NO_ARGUMENT],

 ["-f", "--file", GetoptLong::REQUIRED_ARGUMENT],

 ["-l", "--lines", GetoptLong::OPTIONAL_ARGUMENT])

Теперь можно в цикле вызвать метод

get
(см. листинг 14.1). Наличие операторных скобок
begin-end
имитирует цикл с проверкой условия в конце. У метода
get
есть синоним
get_option
, существуют также итераторы
each
и
each_option
, которые в точности идентичны.

Листинг 14.1. Получение флагов из командной строки

filename = nil

lines = 0 # По умолчанию вывод не усекается.

loop do

 begin

opt, arg = parser.get

break if not opt

# Только для отладки...

puts (opt +" => " + arg)

case opt

when "-h"

puts "Usage: ..."

break # Прекратить обработку, если задан флаг -h.

when "-f"

filename = arg # Запомнить аргумент - имя файла.

when "-l"

if arg != ""

lines = arg # Запомнить аргумент - число строк (если задан).

else

lines = 100 # Оставляемое по умолчанию число
строк.

end

end

 rescue => err

puts err

break

 end

end

puts "имя файла = #{filename}"

puts "число строк = #{lines}"

Метод

get
возвращает
nil
, если флаг отсутствует, но пустую строку, если для флага не задан аргумент. Возможно, это ошибка.

В этом примере мы перехватываем исключения. Всего их может быть четыре:

• 

AmbiguousOption
— указано сокращенное длинное имя флага, но сокращение не уникально;

• 

InvalidOption
— неизвестный флаг;

• 

MissingArgument
— для флага не задан аргумент;

• 

NeedlessArgument
— указан аргумент для флага, который не должен сопровождаться аргументом.

Сообщения об ошибках обычно выводятся на

stderr
, но вывод можно подавить, присвоив акцессору
quiet=
значение
true
.

Библиотека

getoptlong
располагает и другими возможностями, которых мы здесь не обсуждали. Подробности вы найдете в документации.

Существуют другие библиотеки, например

OptionParser
, предлагающие несколько иную функциональность. Дополнительная информация приведена в архиве приложений Ruby.

14.2.2. Константа ARGF

Глобальная константа

ARGF
представляет псевдофайл, получающийся в результате конкатенации всех имен файлов, заданных в командной строке. Во многих отношениях она ведет себя так же, как объект
IO
.

Когда в программе встречается «голый» метод ввода (без указания вызывающего объекта), обычно имеется в виду метод, подмешанный из модуля

Kernel
(например,
gets
и
readlines
). Если в командной строке не задано ни одного файла, то по умолчанию источником ввода является объект
stdin
. Но если файлы заданы, то данные читаются из них. Понятно, что конец файла достигается в конце последнего из указанных файлов.

Если хотите, можете обращаться к

ARGF
явно:

# Скопировать все файлы на stdout.

puts ARGF.readlines

Быть может, вопреки ожиданиям, признак конца файла устанавливается после каждого файла. Так, предыдущий код выведет все файлы, а следующий — только первый файл:

until ARGF.eof?

 puts ARGF.gets

end

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

ARGF
операции
seek
и
rewind
, как если бы это был «настоящий файл».

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

Лекарственные растения. Использование в народной медицине и в быту

Пастушенков Владимир Леонидович
Дом. Дача. Сад. Огород
Дом и Семья:
здоровье и красота
5.00
рейтинг книги
Лекарственные растения. Использование в народной медицине и в быту

Электроника?.. Нет ничего проще!

Эймишен Жан-Поль
885. Массовая радиобиблиотека
Техника:
радиоэлектроника
5.00
рейтинг книги
Электроника?.. Нет ничего проще!

Александр Иванович Шокин. Портрет на фоне эпохи

Коллектив авторов
6. Созидатели отечественной электроники
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Александр Иванович Шокин. Портрет на фоне эпохи

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Ермак. Регент

Древние тайны (Сборник)

Булычев Кир
Алиса и ее друзья в лабиринтах истории
Детские:
детская фантастика
6.00
рейтинг книги
Древние тайны (Сборник)

Робин Уильямс. Грустный комик, который заставил мир смеяться

Ицкофф Дэйв
Иконы кино. Биографии великих деятелей кинематографа
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Робин Уильямс. Грустный комик, который заставил мир смеяться

Точка Бифуркации XI

Смит Дейлор
11. ТБ
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации XI

"Фантастика 2024-68". Компиляция. Книги 1-22

Фролов Андрей
Фантастика 2024. Компиляция
Фантастика:
фэнтези
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
Фантастика 2024-68. Компиляция. Книги 1-22

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.25
рейтинг книги
Второгодка. Книга 3. Ученье свет

Печать пожирателя 6

Соломенный Илья
6. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
фантастика: прочее
5.00
рейтинг книги
Печать пожирателя 6

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Worm

Дж Мак Крей
Фантастика:
боевая фантастика
киберпанк
6.25
рейтинг книги
Worm

Корабль смерти, Стальной человек и другие самые невероятные истории (сборник)

Матесон Ричард
Шедевры фантастики
Фантастика:
научная фантастика
ужасы и мистика
6.80
рейтинг книги
Корабль смерти, Стальной человек и другие самые невероятные истории (сборник)

Стихотворения и поэмы (основное собрание)

Бродский Иосиф Александрович
Поэзия:
поэзия
5.00
рейтинг книги
Стихотворения и поэмы (основное собрание)