在Perl中检查有效命令行参数的简便方法?

时间:2011-02-16 21:30:42

标签: perl

我正在寻找一种简单的方法来检查正确数量的命令行参数,如果发生错误则显示用法消息,然后立即退出。

我想到了像

这样的东西
if (@ARGV < 3) {
  print STDERR "Usage: $0 PATTERN [FILE...]\n";
  exit 1;
}

这是一个有效的模式吗? Sry,我是一个完全的Perl noob: - )。

5 个答案:

答案 0 :(得分:28)

另外,我强烈建议使用在Perl,Getopt::Long模块中处理命令行参数的惯用方法(并开始使用命名参数而不是基于位置的参数)。

如果你有&lt; 3参数,你真的不关心。如果你有参数a,b和C,你通常会关心。

就命令行界面设计而言,3个参数是关于位置参数(cmd <arg1> <arg2>)与任何顺序的命名参数(cmd -arg1 <arg1> -arg2 <arg2>)之间的截止点。

所以你最好这样做:

use Getopt::Long;
my %args;
GetOptions(\%args,
           "arg1=s",
           "arg2=s",
           "arg3=s",
) or die "Invalid arguments!";
die "Missing -arg1!" unless $args{arg1};
die "Missing -arg2!" unless $args{arg2};
die "Missing -arg3!" unless $args{arg3};

答案 1 :(得分:12)

另一种常见的方法是使用die

die "Usage: $0 PATTERN [FILE...]\n" if @ARGV < 3;

您可以在命令行中获得@ARGV特殊变量的更多帮助:

perldoc -v @ARGV

答案 2 :(得分:5)

是的,没关系。 @ARGV包含命令行参数,并在标量上下文中计算其编号。

(虽然您的错误消息看起来好像是@ARGV < 2< 1。)

答案 3 :(得分:1)

使用$#ARGV获取perl脚本的传递参数总数,如下所示:

if (@#ARGV < 4)

我之前使用过并按http://www.cyberciti.biz/faq/howto-pass-perl-command-line-arguments/所示的方式工作。

请参阅http://perldoc.perl.org/perlvar.html的原始文档,其中指出:

  

@ARGV

     

数组@ARGV包含用于脚本的命令行参数。 $#ARGV通常是参数的数量减1,因为$ ARGV [0]是第一个参数,而不是程序的命令名本身。请参阅$ 0获取命令名称。

答案 4 :(得分:-3)

你可以用$#ARGV代替数组@ARGV

if ($#ARGV < 3) { ...