对Perl来说很新,并且日期验证有问题
我运行以下子程序以检查用户日期输入是否符合YYYY-MM-DD
sub validateDate {
VALIDATE-DATE: {
$date = <STDIN>;
if ($date !~
/^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/) {
print " $userStart in incorrect format, should be yyyy-mm-dd\n"
print " Would you like to re-enter a date press (Y or N)?\n";
my $choice = <STDIN>;
if ($choice =~ /[Yy]/) {
redo VALIDATE_DATE;
} else {
exit;
}
}
return $date;
}
}
然而,当我运行它时,我收到此错误:
Unmatched [ in regex; marked by <-- HERE in m/^(19|20)\d\d([ <-- HERE - / at common_subs.pl line 60.
Compilation failed in require at add.pl line 7.
错误说有一个无与伦比的'['但事实并非如此。我认为正则表达式本身有问题吗?我从一个单独的文件中调用sub。
答案 0 :(得分:4)
首先,逃避/
。 /
用作正则表达式文字的分隔符。该文字中的/
应该被转义。
/^(19|20)\d\d([- \/.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/
# ^^
或使用不同的分隔符:
m{^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$}
以下行缺少终止;
:
print " $userStart in incorrect format, should be yyyy-mm-dd\n";
# ^
答案 1 :(得分:3)
事实上,你的正则表达式确实缺少]
。
由于/
是分隔符号,perl编译器会停留在正则表达式中未转义的斜杠上,这样你的正则表达式就会像这样:
/^(19|20)\d\d([- /
显然缺少]
; - )
使用不同的分隔符(通常是人们使用!
或类似的东西)或者只是逃避斜杠。