Руби GetoptLong модифицирует ARGV? - PullRequest
2 голосов
/ 26 мая 2011

Документация для Ruby's GetoptLong создала у меня впечатление, что он удалит проанализированные параметры из ARGV. Вот этот отрывок:

Например, если -a не требует аргумента и -b необязательно принимает аргумент, Разбор '-a один -b два три' приведет к тому, что (-a ',' ') и (' -b ',' two ') будут обработаны как пары option / arg, а' one ',' three '- осталось в АРГВ.

Однако, похоже, это не так. Вот моя программа:

#!/usr/bin/env ruby

require "getoptlong"
opts = GetoptLong.new(
  ["--start", "-s", GetoptLong::REQUIRED_ARGUMENT],
  ["--base",  "-b", GetoptLong::REQUIRED_ARGUMENT]
)

puts ARGV

А вот и вывод:

$ number-photos --start 2 --base foo *
--start
2
--base
foo
aac-to-mp3
backup-wp-uploads
exiv-webcam-imgs
get-updates
music-to-lily
number-photos
ogg-to-mp3
rename-music
restore-uploads
resymlink
sprints
sync-jt
sync-st
timestamp
unix-names

(я проверил, что я на ruby ​​1.9.2.)

Я мог бы удалить опции вручную, но это было бы немного головной болью, поскольку, в зависимости от того, как вы их передаете, каждый мог занять один или два слота в массиве (--base=foo против --base foo ). Было бы намного удобнее, если бы GetoptLong мог удалить их для меня. Есть ли способ сделать это?

1 Ответ

4 голосов
/ 26 мая 2011

Полагаю, я понял, что это означает, что элемент не был помещен в группу getopt ... он оставлен в ARGV, как и все остальное ... Зачем он изменяет ARGV? Eww.после некоторых экспериментов с примером в документации, он не удаляет элементы из ARGV до тех пор, пока не будет запущен opts.each ... похоже, что удаление является побочным эффектом посещения элемента в опциях.форма.(

...