perl中的4位数验证

时间:2011-07-14 16:52:44

标签: regex perl validation digits

当我将命令行参数传递给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"; }

3 个答案:

答案 0 :(得分:4)

这个怎么样:

if (($fiscyear1 !~ m/^\d{4}$/) or ($fiscyear2 !~ m/^\d{4}$/) or ($fiscyear1 > $fiscyear2))
   { print "Bad parameters\n"; }

我将and中的or和最后的<更改为>(因为您希望第一个参数小于第二个参数)

编辑:

似乎它适用于我的情况:

enter image description here

我也非常强烈地接受使用^$的建议,并相应地修改了我的答案。

答案 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";