我有日期说$ date1,$ date2,$ date3。 我想创建这些日期的数组传递给子程序&想要检索每个日期的状态。子程序内的正则表达式将评估日期格式 我已将子程序创建为DateValidator as,
my @newDateArray = qw /$date1, $date2, $date3/;
foreach (@newDateArray) {
print "Date used $_ : ";
DateValidator($_);
}
# Subroutine to evaluate dates
sub DateValidator {
my $dateVal=shift;
if ($dateVal =~ /^20?\d{2}\-0?(:?[1-9]|10|11|12)\-(\d{2})$/) {
if ($2 <= 31) {
print "All DD's are correct\n";
} else {
print "Please verify the DD again !\n";
}
} else {
print "Please enter correct date !\n";
}
}
这不能按预期工作。任何帮助将不胜感激。
答案 0 :(得分:4)
qw()
函数不插入变量。所以这段代码:
my @newDateArray = qw /$date1, $date2, $date3/;
需要:
my @newDateArray = ($date1, $date2, $date3);
即。用一对简单的括号替换qw()
。
the documentation中没有明确提到这一点,但有一个相当微妙的提及:
使用嵌入的空格作为单词分隔符,计算从STRING中提取的单词列表。可以理解为大致等同于:
split(" ", q/STRING/);
观察者会注意到单个引用的STRING - 使用q()
- 不会插入变量。我同意,这可能写得好几百倍了。
另外,您可能会注意到文档说:
一个常见的错误是尝试用逗号分隔单词或将注释放入多行qw-string中。因此,如果STRING包含&#34;,&#34;使用警告pragma和-w开关(即$ ^ W变量)会产生警告。或者&#34;#&#34;字符。
您没有注意到,这让我怀疑您没有使用警告。这是一个非常非常糟糕的主意。有关详细信息,请参阅Why use strict and warnings?。