Подтвердить что ты не робот

Как анализировать аргумент без имени с помощью Ruby optparse

Мне нужно проанализировать командную строку, например

  script.rb <mandatory filename> [options]

с optparse.

Конечно, я могу написать какой-то пользовательский код для обработки имени файла, а затем передать ARGV, чтобы optparse, но, возможно, есть более простой способ сделать это?

EDIT: существует еще один хакерский способ разобрать такую ​​командную строку, и это передать ['--mandatory-filename'] + ARGV, чтобы optparse, а затем обработать параметр --mandatory-filename.

4b9b3361

Ответ 1

Сначала parse! с optparse, затем сканируйте ARGV и поднимите, если ARGV пуст. Например:

op.parse!
filename = ARGV.pop
raise "Need to specify a file to process" unless filename

Обязательное имя файла не будет обрабатываться OptionParser и останется для вас в ARGV - если оно там отсутствует, просто поднимите вручную.

Ответ 2

Просто для того, чтобы следить за тем, что сказал Джулик и Тень Firefirebird: Когда синтаксический анализ с OptionParser должен знать, что parse! и parse имеют разную функциональность. Первый будет удалять все аргументы, которые он понимает из переданного массива, где последний оставит их. Это изменяет ваши условия для определения наличия требуемого аргумента.

Ответ 3

Хотя это не относится ко всем ситуациям, часто бывает полезно обрабатывать несколько файлов в одной командной строке, например:

script.rb [options] file1 file2 ...

file1 является обязательным, но file2 и последующие необязательны.

Лучший способ, которым я это знаю, следует этому соглашению:

options = {}
optparse = OptionParser.new do |opts|
  opts.banner = "Usage: script.rb [options] file1 file2 ..."

  opts.on('-a', '--an-option ARG', 'Set some option') do |arg|
    options[:a] = arg
  end

  ...
end
optparse.parse!

# Check required conditions
if ARGV.empty?
  puts optparse
  exit(-1)
end

Если файлы не указаны, появится справочное сообщение с баннером использования и описанием параметров. Если файлы присутствуют, они будут единственными, что осталось в ARGV.

Ответ 4

Я не уверен, добавлен ли он недавно, но ни один из предыдущих ответов не упоминает, что optparse.parse вернет значение ARGV после удаления проанализированных опций.

Если вы это сделаете:

rest = optparse.parse!

Вы получите массив с заданным файлом /s (по неизвестным параметрам). Таким образом, вам не нужно заботиться о том, будут ли параметры доступны до или после файла.

Ответ 5

Optparse использует аргументы с параметрами AFAIK. "Правильный" способ обработки вашего имени файла - иметь дело с ним вне optparse. Я отправил код примера для этого в ответ на этот вопрос.

Кстати, это довольно необычная командная строка. Если это только для вас, отлично, но другие, скорее всего, найдут его скорее противоречащим интуиции. Было бы более нормальным иметь: script.rb [options] <filename>...