【问题标题】:Using Time::Piece with Apache::Log::Parser将 Time::Piece 与 Apache::Log::Parser 一起使用
【发布时间】:2017-07-07 22:59:13
【问题描述】:

我正在使用Apache::Log::Parser 来解析 Apache 日志文件。

我使用以下代码从日志文件中提取了日期。

my $parser = Apache::Log::Parser->new(fast=>1);
my $log = $parser->parse($data);
$t = $log->{date};

现在,我尝试使用Time::Piece 来解析日期,但我无法做到。

print "$t->day_of_month";

但是,它不起作用。如何使用 Time::Piece 解析日期?

【问题讨论】:

    标签: apache perl parsing cpan


    【解决方案1】:

    您不能在字符串插值内调用对象的方法。它可能会输出如下内容:

    Sat Feb 18 12:44:47 2017->day_of_month
    

    去掉双引号""调用方法。

    print $t->day_of_month;
    

    现在的输出是:

    18
    

    请注意,如果您的日志中有纪元值,则需要使用 localtimegmtime 创建 Time::Piece 对象,如果日期是某种时间戳,则需要使用 strptime

    【讨论】:

    • 删除了双引号并抛出错误Can't call method "day_of_month" without a package or object reference
    • @Pradeep 阅读了我回答的最后一部分。您需要先创建一个对象。只是将 Time::Piece 放入并不会神奇地将某些值转换为日期对象。
    • 试图创建一个新的Time::Piece Object ,Time::Piece->strptime($log->{date}, "%Y"); 但一直抛出错误Error parsing time at C:/xampp/perl/lib/Time/Piece.pm line 469
    • @Pradeep 阅读错误消息,并查看您的日期字符串。 %Y 只是四位数的年份,如 2017。您需要 full 时间戳。
    • 您是否阅读过@Pradeep 文档? Time::Piece 文档链接到pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html,它清楚地解释了它是如何工作的。 %d/%b/%Y 应该匹配 31/Jul/1999
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2010-11-07
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多