$ を追加するだけで、日付に 2 桁以上を許可するという最初の問題は解決しますが、より微妙なバグが発生します: 最後に改行があっても日付が検証されるようになりました。これはアプリケーションによっては問題にならない場合もありますが、次の例の正規表現を使用することで回避できます。
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";
}
}
注:はPerl のベスト プラクティス/smx
で推奨されており、特別な必要がない限り、正規表現を使用して記述していますが、慣れていない場合はつまずく可能性があります。
/s
/m
複数行の文字列をより簡単に処理できるようになります。/s
なぜなら、.
は改行に一致し、 と/m
を使用^
し$
てそれぞれ行の開始と終了に一致し、 \A
and\z
は文字列全体の開始と終了に一致するためです。
/x
正規表現内で空白とコメントを許可するだけですが、実際に一致させようとしている場合は空白をエスケープする必要があります。
この場合、\z
代わりに$
それを使用しているため、の使用に関係なく違いが生じます/smx
。
また、モジュールを調べて、日付形式の検証だけでなく、日付の検証を実行することも悪い考えではないかもしれません (繰り返しますが、これを何に使用するかによって異なります)。perlmonks に関するこの議論を参照してください。