Perl 中的 4 位数字验证
应该小于第二个传递的参数,并且两个参数都应该只是数字,而且它们应该恰好是 4。
当我将命令行参数传递给 perl 程序时,我进行了验证检查。我通过了两年,第一个传递的参数 >#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"; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这听起来像是一个过度思考的糟糕情况......
您想要验证参数是否为两年,采用 YYYY 形式,并且第二年在第一年之后。
嗯,9999 可以通过任何数字检查,但它几乎不是一个有效的年份。与 0101 或 3021 等相同。
您想要的是设置给定范围,并确保参数是数字。
This sounds like a bad case of overthinking things...
What you want is to verify that the arguments are two years, in the form YYYY, and that the second year comes after the first.
Well, 9999 would pass any digit check, but it is hardly a valid year. Same with 0101, or 3021, etc.
What you want is to set a given range, and make sure the arguments are numeric.
怎么样:
我将< 更改为
or
中的and
以及最终的>
(因为你希望第一个参数小于第二个)编辑:
它似乎适用于我的情况:
我也非常强烈地接受使用建议
^$
,并相应地修改了我的答案。What about this:
I changed the
and
s inor
s and also the final<
into>
(since you want the first argument is less than the second)EDIT:
It seems that it works in my case:
I also very strongly accept the advice of using
^$
, and have modified my answer accordingly.您在正则表达式中缺少字符串
^
和$
的开头和结尾(没有它们,它可以匹配 5 个或更多符号):更新
您还可以在此处使用
unless
,例如:You are missing start and end of string
^
and$
in regexps (without them it can match 5 or more symbols):Update
You can also use
unless
here like: