Perl:验证命令行参数是整数而不是文件

T2t*_*rue 0 perl

我需要检查(Perl)命令行参数是否只是一个整数和一个文件.

我可以检查是否输入了正确数量的参数:

if (@ARGV != 2){
Run Code Online (Sandbox Code Playgroud)

并且,我可以检查以确保参数的顺序是正确的:

    if ($ARGV[0] >= $ARGV[1])
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何检查参数是否是一个文件.我想打印和错误消息,如果它是一个文件.

谢谢

Sch*_*ern 8

您可以通过一些检查手动完成此操作.

sub usage {
    return "$0 <integer> <filename>\n";
}

if( @ARGV != 2          ||    # right number of arguments
    $ARGV[0] !~ /^\d+$/ ||    # first one is an integer
    !-f $ARGV[1]        ||    # second is a readable file
    !-r $ARGV[1]
) {
    die usage();
}
Run Code Online (Sandbox Code Playgroud)

请注意,不需要额外检查参数的顺序是否正确.


或者你可以用像Getopt :: Args这样的模块来做.这是一个更好的解决方案,因为它是声明性的,并消除了大量的冗余和潜在的错误.

#!/usr/bin/env perl

use strict;
use warnings;
use v5.10;
use Getopt::Args;

arg integer => (
    isa         => 'Int',
    required    => 1,
    comment     => 'an integer',
);
arg filename => (
    isa         => 'Str',
    required    => 1,
    comment     => 'a filename',
);

# Extra checks for a readable filename.
my $args = optargs();
if( !-r $args->{filename} ||
    !-f $args->{filename}
) {
    die usage();
}
Run Code Online (Sandbox Code Playgroud)

它将产生自己的使用信息.

$ perl ~/tmp/test.pl
usage: test.pl INTEGER FILENAME

  Arguments:
    INTEGER    an integer
    FILENAME   a filename
Run Code Online (Sandbox Code Playgroud)

对于将来的程序,它也将处理--options和子命令.

如果您不喜欢这个,可以选择许多Getopt模块.