まず、"/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/";
警告がオンになっている場合は、次のようになっているはずです。
C:\temp\jj.pl 行 7 で認識されないエスケープ \d が渡されました。
C:\temp\jj.pl 行 7 で認識されないエスケープ \D が渡されました。
C:\temp\jj.pl 行 7 で認識されないエスケープ \d が渡されました。
…
の値を出力REGEXP1
すると、/^d{4}Dd{2}Dd{2}Dd{2}Dd{2}Dd{2}Dd{3}
(*待って、どうしたの$/
?) が得られます。明らかに、それはあなたが望んでいたパターンのようには見えません。
これで、その文字列を入力して補間してパターンにすることができますが"/^\\d{4}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{3}\$/"
、それは大変な作業です。代わりに、正規表現引用演算子qr
を使用して定数を定義できます。
#!/usr/bin/env perl
use 5.012;
use strict;
use warnings;
use constant REGEXP1 => qr/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/;
my $s = "2013-03-20 11:09:30.788";
say $s =~ REGEXP1 ? 'yes' : 'no';
もう 1 つ落とし穴があります。 \d
andは、それぞれと\D
だけではなく、さらに一致します。したがって、代わりに、次のようにパターンを記述できます。[0-9]
[^0-9]
use constant REGEXP1 => qr{
\A
(?<year> [0-9]{4} ) -
(?<month> [0-9]{2} ) -
(?<day> [0-9]{2} ) [ ]
(?<hour> [0-9]{2} ) :
(?<min> [0-9]{2} ) :
(?<sec> [0-9]{2} ) [.]
(?<msec> [0-9]{3} )
\z
}x;
しかし、これらの値に意味があるかどうかという疑問が残ります。それが重要な場合は、DateTime::Format::Strptimeを使用できます。
#!/usr/bin/env perl
use 5.012;
use strict;
use warnings;
use DateTime::Format::Strptime;
my $s = "2013-03-20 11:09:30.788";
my $strp = DateTime::Format::Strptime->new(
pattern => '%Y-%m-%d %H:%M:%S.%3N',
on_error => 'croak',
);
my $dt = $strp->parse_datetime($s);
say $strp->format_datetime($dt);