Простое добавление $ решает исходную задачу позволяет более двух цифр в день, но вводит более тонкую ошибку: даты теперь будет проверять, несмотря на наличие новой строки в конце. Это может не иметь значения в зависимости от вашего приложения, но его можно избежать, используя регулярное выражение в следующем примере:
use strict;
use warnings;
my @tests = (
'2012_4_123',
'2012_11_22',
"2012_11_22\n",
);
use Data::Dumper;
print Dumper \@tests;
foreach my $test (@tests) {
if ($test !~ m/\A(\d{4})_(\d{1,2})_(\d{1,2})\z/smx)
{
print "invalid format\n";
}
else
{
print "valid format\n";
}
}
Примечание: /smx
рекомендовано Perl Best Practices и я пишу свои регулярные выражения с ним, если нет конкретная необходимость не иметь его, но он может вас тронуть, если вы к этому не привыкли.
/s
и /m
позволит вам легко обрабатывать многострочные строки; /s
потому что .
будет соответствовать новой строки и /m
, чтобы позволить вам использовать ^
и $
, чтобы соответствовать начало и конец строки соответственно, и \A
и \z
будет соответствовать начало и конец всей строки.
/x
- просто разрешить пробелы и комментарии в регулярном выражении, хотя вам нужно избегать пробелов, если вы на самом деле пытаетесь их сопоставить.
В этом случае используется \z
вместо $
, что делает разницу независимо от использования /smx
.
Кроме того, неплохо было бы взглянуть на модуль для проверки даты, а не только на проверку формата даты (опять же, в зависимости от того, для чего вы используете это). См. Это discussion on perlmonks.
Вы можете опустить круглые скобки в своем регулярном выражении, если вы не используете захваты позже в своем скрипте. – Kenosis