当我将命令行参数传递给perl程序时,我有一个验证检查。我通过两年第一次传递的参数应该小于第二个传递的参数,并且两个参数应该只是数字,而且它们应该恰好是4
#Sunny>perl check.pl 2007 2008
这很好
#Sunny>perl check.pl 2008 2007
这很糟糕
#Sunny>perl check.pl 200 2007
这很糟糕
我已为此编写代码,但无法弄清楚为什么它无效。
#!usr/bin/perl
#check.pl
if ($#ARGV < 0) { }
else
{
$fiscyear1 = $ARGV[0];
$fiscyear2 = $ARGV[1];
}
if (($fiscyear1 !~ m/\d{4}/) and ($fiscyear2 !~ m/\d{4}/) and ($fiscyear1 < $fiscyear2))
{ print "Bad parameters\n"; }
else
{ print "good parameters\n"; }
答案 0 :(得分:4)
这个怎么样:
if (($fiscyear1 !~ m/^\d{4}$/) or ($fiscyear2 !~ m/^\d{4}$/) or ($fiscyear1 > $fiscyear2))
{ print "Bad parameters\n"; }
我将and
中的or
和最后的<
更改为>
(因为您希望第一个参数小于第二个参数)
编辑:
似乎它适用于我的情况:
我也非常强烈地接受使用^$
的建议,并相应地修改了我的答案。
答案 1 :(得分:4)
这听起来像是过度思考事物的坏情况......
你想要的是验证参数是两年,格式是YYYY,第二年是第一年。
那么,9999会通过任何数字检查,但它几乎不是有效年份。与0101,或3021等相同
你想要的是设置一个给定的范围,并确保参数是数字。
use strict;
use warnings;
my $yr1 = shift;
my $yr2 = shift || usage();
usage() unless $yr1 =~ /^\d+$/;
usage() unless $yr2 =~ /^\d+$/;
my $min_year = 1900;
my $max_year = 2200;
if ( ($yr1 < $min_year) or ($yr1 > $max_year) ) {
die "Invalid year: $yr1";
}
if ( ($yr2 < $min_year) or ($yr2 > $max_year) ) {
die "Invalid year: $yr2";
}
if ( $yr1 >= $yr2 ) {
die "Invalid sequence: $yr2 is not greater than $yr1";
}
sub usage {
die "Usage script.pl <year1> <year2>";
}
答案 2 :(得分:3)
您在正则表达式中缺少字符串^
和$
的开头和结尾(没有它们可以匹配5个或更多符号):
use strict; use warnings;
my ($fiscyear1, $fiscyear2) = @ARGV;
if ($fiscyear1 =~ m{^\d{4}$} && $fiscyear2 =~ m{^\d{4}$} && $fiscyear1 < $fiscyear2) {
print "good parameters\n";
} else {
print "Bad parameters\n";
}
<强>更新强>
你也可以在这里使用unless
,如:
unless ($fiscyear1 =~ m{^\d{4}$} && $fiscyear2 =~ m{^\d{4}$} && $fiscyear1 < $fiscyear2) {
print "Bad parameters\n";
exit(1); ## tells the caller side that there is an error
}
print "good parameters\n";