DateTime :: Format :: Builder :: Parser :: Regex: анализатор-конструктор - PullRequest
0 голосов
/ 23 декабря 2010

Может кто-нибудь показать мне рабочий конструктор?
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;
}

редактирование: Изменено регулярное выражение, так что postprocess fix_year имеет больше смысла;

1 Ответ

1 голос
/ 23 декабря 2010

Я начал читать документ в том же месте, что и вы.Фу!

После небольшого обратного отслеживания кажется, что этот модуль эффективно работает за кулисами, и 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');

Также взгляните на метод create_constructor () в DateTime :: Format :: Builder, который устанавливаетконструктор по умолчанию.

...