指定可选参数的正确语法是什么?

时间:2010-11-10 08:11:33

标签: perl syntax

我有一个可以被称为

的Perl脚本
perl mysrc.pl -a=3 -b=4 -c=6

perl mysrc.pl -t=15

基本上,(要么提供t的值)OR(提供所有abc)的值。至少必须指定其中一组值。

如何在语法中说出上述内容?

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

意味着所有参数都是可选的,但情况并非如此。编写mysrc.pl的语法的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

两个选项:使用“|”作为“OR”符号和非方括号进行分组以避免“可选”上下文,或列出多行竞争用法

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

答案 1 :(得分:3)

我可能会使用:

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

其中'...'表示任何其他选项,或文件名,或根本没有。如果一个或另一个集是强制性的,我可以使用大括号“{}”而不是方括号“[]”。方括号通常表示“可选”。

答案 2 :(得分:1)

你的意思是帮助文字?在这种情况下,您可以执行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]