使用perl中的子例程的日期验证器

时间:2014-03-19 14:54:52

标签: perl

我有日期说$ 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";
    }
}

这不能按预期工作。任何帮助将不胜感激。

1 个答案:

答案 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?