Программирование на языке Ruby - [173]

Шрифт
Интервал

> ["-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, как если бы это был «настоящий файл».

С константой >ARGF ассоциирован метод >file — он возвращает объект >IO, соответствующий файлу, обрабатываемому в данный момент. Естественно, возвращаемое значение изменяется по мере перехода от одного файла к другому.

А если мы не хотим интерпретировать имена аргументов в командной строке как имена файлов? Тогда не надо обращаться к методам ввода без указания вызывающего объекта. Если вы хотите читать из стандартного ввода, укажите в качестве такого объекта >STDIN, и все будет работать правильно.

14.2.3. Константа ARGV

Глобальная константа >ARGV представляет список аргументов, переданных в командной строке. По сути дела, это массив.

>n = ARGV.size

>argstr = '"' + ARGV*"," + '"'

>puts "Мне было передано аргументов: #{n}..."

>puts "Вот они: #{argstr}"

>puts "Заметьте, что ARGV[0] = #{ARGV[0]}"

Если запустить эту программу с аргументами >red green blue, то она напечатает:

>Мне было передано аргументов: 3...

>Вот они: "red,green,blue"

>Заметьте, что ARGV[0] = red

Ясно, что отдельно передавать число аргументов, как в былые времена, не нужно; эта информация — часть массива.

Привычных к старым соглашениям программистов может смутить также тот факт, что нулевой элемент массива — настоящий аргумент (а не, скажем, имя сценария). Нумерация аргументов начинается с нуля, а не с единицы, как в языке С и в различных интерпретаторах команд.

14.3. Библиотека Shell

Не всегда Ruby удобен в качестве языка сценариев. Например, в языке bash для запуска внешней программы достаточно просто указать ее имя безо всякого дополнительного синтаксиса.

Оборотной стороной мощи и гибкости Ruby является более сложный синтаксис. Кроме того, функциональность разнесена по различным классам, модулям и библиотекам.

Это послужило основанием для создания библиотеки >Shell, которая упрощает, к примеру, организацию конвейеров команд и перенаправление вывода в файл. Кроме того, она сводит воедино функциональность из разных источников, скрывая ее за интерфейсом объекта >Shell. (На платформе Windows эта библиотека работает не во всех случаях.)

14.3.1. Использование библиотеки Shell для перенаправления ввода/вывода


Рекомендуем почитать
Графика DirectX в Delphi

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


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.