Точно 4 цифры проверки в Perl - PullRequest
2 голосов
/ 14 июля 2011

У меня есть проверка проверки, когда я передаю параметры командной строки в программу 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 ]

4 голосов
/ 14 июля 2011

Это звучит как плохой случай переосмысления вещей ...

Вам нужно убедиться, что аргументы указаны в двухлетнем формате 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>";
}
4 голосов
/ 14 июля 2011

Что по этому поводу:

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

Я изменил and с за or с, а также окончательный < на > (так как вы хотите, чтобы первый аргумент был меньше второго)

EDIT:

Кажется, это работает в моем случае:

enter image description here

Я также очень настойчиво принимаю совет по использованию ^$ и соответственно изменил свой ответ.

3 голосов
/ 14 июля 2011

Вам не хватает начала и конца строки ^ и $ в регулярных выражениях (без них он может соответствовать 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...