0

我有 2 个日期(连同日期和时间),它们采用以下格式:

Mon Aug 12 17:32:39 PDT 2013

这是我的本地时间,其他时间存储在哈希中。我需要使用所有可能的日期和时间比较来将此时间与哈希存储时间进行比较。

这就是我所拥有的

#!/usr/bin/perl

use DateTime;
open(FH,'log.txt');

my %stat;

my ($qbsid, $exittime, $exittimeval);
while ($line = <FH>) {
        if ($line =~ /Exit time/) {
        ($exittime, $exittimeval) = split(': ',$line);
         $stat{$qbsid} = {
            time     => $exittimeval
            };
    }
}

my $local_time = localtime time;
foreach my $qbsid (keys %stat){
    my $cmd = $stat{$qbsid}->{time};
    my $cmp = DateTime->compare($cmd,$datetime);
    print "$cmp\n";
    }

请建议我一种方法来做到这一点。

哈希以与上述相同的格式打印日期:

Mon Aug 10 14:31:49 PDT 2013

感谢您的时间。

4

2 回答 2

0

我要推荐Time::Piece。这似乎不是太多人最喜欢的时间模块,但它带有 Perl,这意味着您不必安装它。我怀疑它将成为标准时间模块,您不妨学习如何使用它。早期版本的Time::Piece朱利安日期有问题,但最新版本解决了这个问题(并将在下一个 Perl 版本中)。

在不知道您的日志是什么样子以及您正在尝试做什么的情况下,帮助您进行编码有点困难。例如,您有一个$qbsid未设置的哈希使用的哈希。你需要在你的程序中使用use strict;和。use warnings;这将捕获此错误。它也会$local_time在您在第二个循环之前声明但$datetime在该循环中使用时发现错误。

此外,split不采用字符串,而是将正则表达式模式作为第一个参数。

您还需要chomp $line在您的while声明之后立即执行。否则,您$line将以不可见的 NL 字符结尾,这可能会导致各种问题。

现在,您到底想存储什么?看起来您的内部哈希存储为当前时间作为键和您$exittimeval的值。

我将使用纪元时间(即自 1970 年 1 月 1 日以来的秒数)作为键,并将Time::Piece对象作为您的数据:

($exittime, $exittimeval) = split /:\s+/, $line);
my $exit_time_obj = Time::Piece->strptime( $exittimeval, "%a %b %d %H:%M:%S %Z %Y");
my $time_obj = Time::Piece->new(time);
$stat{$qbsid} = {$time_obj->epoch => $exit_time_obj};

现在,您可以通过将键更改为 Time::Piece 对象并进行您想要的任何比较来进行比较。

顺便说一句,另一个问题:time不断变化!如果您按时间键入子哈希,那么在您进入第二个循环时它会有所不同。您需要使用第二个循环来获取这些实际密钥。

my $local_time = Time::Piece->new(time);
foreach my $qbsid (keys %stat) {
    for my $key_time ( keys %{ $stat{$qbsid} } )( 
        my $cmd = $stat{$qbsid}->{$key_time}; # Already a Time::Piece object
        if ( $local_time->year eq $cmd->year ) {
           print "Years match: " . $cmd->year . "\n";
        }
        if ( $local_time->month eq $cmd->month ) {
           print "Months match: " . $cmd->Month . "\n";
        }
        ...
    }
}

不幸的是,这是非常不完整的,因为我不知道你真正想要做什么。

  • log.txt看起来像什么?
  • 有哪些不同的领域log.txt
  • 你想用`log.txt做什么?
  • 你想要什么作为你的程序的结果?

我不可能知道如何指导你。

于 2013-10-11T14:28:10.113 回答
0

你应该看看Date::Calc。该模块提供了用于比较日期的实用程序。正则表达式在这里是错误的方法。

于 2013-10-11T12:36:54.787 回答