有没有人能给我看一个可以工作的构造函数?
DateTime::Format::Builder::Parser::Regex
#!/usr/bin/env perl
use warnings;
use 5.012;
use DateTime::Format::Builder;
use DateTime::Format::Builder::Parser::Regex;
my $parser = DateTime::Format::Builder->create_parser(
regex => qr/^(\d\d)(\d\d)(\d\d)T(\d\d)(\d\d)(\d\d)$/,
length => 13,
params => [ qw( year month day hour minute second ) ],
postprocess => \&_fix_year,
extra => {time_zone => "Australia/Sydney" },
constructor => ..., ###
);
sub _fix_year {
my %args = @_;
my ( $date, $p ) = @args{ qw( input parsed ) };
$p->{year} += $p->{year} > 69 ? 1900 : 2000;
return 1;
}编辑:更改了正则表达式,以便后处理fix_year更有意义;
发布于 2010-12-24 04:51:33
我和你是在同一时间开始读文档的。呼!
经过一些回溯之后,这个模块似乎在幕后有效地工作,DateTime::Format::Builder将其作为插件调用。因此,使用创建自己的解析类的常规习惯用法,我认为它是:
#!/usr/bin/perl
package MyDateParser;
use common::sense;
use DateTime;
use DateTime::Format::Builder;
use DateTime::Format::Builder::Parser::Regex;
use DateTime::Format::Builder(
parsers => {
parse_datetime => {
regex => qr/^(\d\d\d\d)(\d\d)(\d\d)T(\d\d)(\d\d)(\d\d)$/,
length => 15,
params => [ qw( year month day hour minute second ) ],
postprocess => \&_fix_year,
extra => {time_zone => "Australia/Sydney" },
constructor => \&_construct_date,
}
}
);
sub _fix_year {
my %args = @_;
my ( $date, $p ) = @args{ qw( input parsed ) };
$p->{year} += $p->{year} > 69 ? 1900 : 2000;
return 1;
}
sub _construct_date {
my ($p, %extra) = @_;
use Data::Dumper; warn Dumper {p => $p, extra => \%extra};
return DateTime->new( %extra );
}
#-----------------------------------------------------------------------
package main;
my $dt = MyDateParser->parse_datetime('00101223T094517');还要看一下DateTime::Format::Builder中的create_constructor()方法,它设置了一个默认构造函数。
https://stackoverflow.com/questions/4519988
复制相似问题