2

コマンド ライン パラメーターを perl プログラムに渡すときに、検証チェックがあります。最初に渡された引数は 2 番目に渡された引数よりも小さい必要があり、両方の引数は数字のみで、正確に 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

これは物事を考えすぎる悪いケースのように聞こえます...

必要なのは、引数が YYYY の形式で 2 年であること、および 2 年目が最初の年より後に来ることを確認することです。

まあ、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 に答える
4

これはどうですか:

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

ands in ors と final<をに変更しました>(最初の引数が 2 番目よりも小さい必要があるため)

編集:

私の場合はうまくいくようです:

ここに画像の説明を入力

また、使用のアドバイスを非常に強く受け入れ、^$それに応じて回答を変更しました。

于 2011-07-14T16:56:26.180 に答える
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 に答える