0

有人可以告诉我一个有效的构造函数吗?
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 确实更有意义;

4

1 回答 1

1

我和你在同一时间开始阅读 doco。呸!

经过一番回溯,该模块似乎在幕后有效地工作,并且 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() 方法,该方法设置了默认构造函数。

于 2010-12-23T20:51:32.947 回答