2

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

3 回答 3

4

那这个呢:

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

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

编辑:

似乎它适用于我的情况:

在此处输入图像描述

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

于 2011-07-14T16:56:26.180 回答
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>";
}
于 2011-07-14T17:29:36.687 回答
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";
于 2011-07-14T17:00:16.730 回答