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

时间:2017-07-05 23:30:16

标签: perl

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

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

if (@ARGV != 2){

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

    if ($ARGV[0] >= $ARGV[1])

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

由于

3 个答案:

答案 0 :(得分: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();
}

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

或者您可以使用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();
}

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

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

  Arguments:
    INTEGER    an integer
    FILENAME   a filename

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

如果你不喜欢这个,there are many Getopt modules to choose from

答案 1 :(得分:1)

您可以使用-f检查给定字符串是否为文件。有关更多选项,请参阅perldoc -X

在我理解的例子中:

die 'First argument is a filename!' if -f $ARGV[0];

答案 2 :(得分:-1)

要测试$ ARGV [0]是否严格为整数,你可以使用这个谓词:

if ($ARGV[0] =~ /^\d+$/) {
    print "an integer\n";
} else {
    print "not an integer\n";
}

执行perldoc perlre获取更多信息。

要测试$ ARGV [0]是否为文件,您可以使用以下内容:

if (-f $ARGV[0]) {
    print "a file\n";
} else {
    print "not a file\n";
}

执行perldoc -f -f以获取有关文件相关测试的大量信息。