Какой правильный синтаксис для указания необязательных параметров? - PullRequest
4 голосов
/ 10 ноября 2010

У меня есть Perl-скрипт, который можно назвать

perl mysrc.pl -a=3 -b=4 -c=6

или как

perl mysrc.pl -t=15

В основном, (либо укажите значение для t) ИЛИ (укажите значения для всех a, b и c) . По крайней мере, одна из групп значений должна быть указана.

Как мне сказать вышеизложенное в синтаксисе?

perl mysrc.pl
     [-a=<value of a>]
     [-b=<value of b>]
     [-c=<value of c>]
     [-t=<value of t>]

будет означать, что все параметры являются необязательными, что не совсем так. Как правильно написать синтаксис для mysrc.pl?

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Два варианта: либо используйте «|»как символ «ИЛИ» и не квадратные скобки для группировки, чтобы избежать «необязательного» контекста, или перечислить конкурирующие варианты использования в нескольких строках

perl mysrc.pl {-a=<value of a> -b=<value of b> -c=<value of c>|-t=<value of t>}

perl mysrc.pl UseCaseOneOptions|UseCaseTwoOptions
     UseCaseOneOptions: -a=<value of a> -b=<value of b> -c=<value of c>
     UseCaseTwoOptions: -t=<value of t>

Для ДЕЙСТВИТЕЛЬНО сложных наборов опций (например, CVS):CVS делает (в настоящий момент нет xterm, поэтому ниже приведено приблизительное приближение по памяти), то есть в общем сообщении «помощь» перечислены только все возможные варианты использования, и для получения справки о наборах опций для каждого варианта использования вы выдаете командусправочная команда для каждого варианта использования.

$ cvs --help
  Usage: cvs <command> <per-command-options>
  Please type "cvs command --help" to get help on specific command's options
  Commands are: 
      cvs add
      cvs commmit
      cvs remove
      ...

$ cvs checkout --help
  Usage: cvs checkout [-p] [-A] [-m message] [-M message_file] file_path
      -m message:          check-in comment
      -M file:             read check-in comment from this file
      -p:                  non-sticky checkout. Print the file to STDOUT.

$ cvs diff --help
  Usage: cvs diff [-r VER1] [-r VER2] [-w] file_path
       -w:                 Ignore whitespace
3 голосов
/ 10 ноября 2010

Я бы, наверное, использовал:

mycmd [ -t=tval | -a=aval -b=bval -c=cval ] ...

где '...' представляет любые другие параметры, или имена файлов, или ничего вообще. И если тот или иной набор является обязательным, я мог бы использовать квадратные скобки {} вместо квадратных скобок []. Квадратные скобки обычно обозначают «необязательно».

1 голос
/ 10 ноября 2010

Вы имеете в виду только текст справки?В этом случае вы можете делать то, что делает Subversion, например:

$ svn help merge
merge: Apply the differences between two sources to a working copy path.
usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
       2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
       3. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [WCPATH]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...