首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTime::Format::Builder::Parser::Regex: parser-constructor

DateTime::Format::Builder::Parser::Regex: parser-constructor
EN

Stack Overflow用户
提问于 2010-12-23 23:17:09
回答 1查看 343关注 0票数 0

有没有人能给我看一个可以工作的构造函数?

DateTime::Format::Builder::Parser::Regex

代码语言:javascript
复制
#!/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更有意义;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-24 04:51:33

我和你是在同一时间开始读文档的。呼!

经过一些回溯之后,这个模块似乎在幕后有效地工作,DateTime::Format::Builder将其作为插件调用。因此,使用创建自己的解析类的常规习惯用法,我认为它是:

代码语言:javascript
复制
#!/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()方法,它设置了一个默认构造函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4519988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档