我需要检查(Perl)命令行参数是否只是一个整数和一个文件。
我可以检查是否输入了正确数量的参数:
if (@ARGV != 2){
并且,我可以检查以确保参数的顺序是正确的:
if ($ARGV[0] >= $ARGV[1])
但是,我不知道如何检查参数是否是文件。如果它是文件,我想打印和错误消息。
由于
答案 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
和子命令。
答案 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
以获取有关文件相关测试的大量信息。