【问题标题】:How to compare and extract the recent date from an array of dates in Perl如何从 Perl 中的日期数组中比较和提取最近的日期
【发布时间】:2014-08-04 05:53:53
【问题描述】:

我已经编写了一个 Perl 脚本来从日志文件中提取内容,在此过程中我有一个包含以前使用正则表达式提取的日期的数组

2014-03-05 18:22:06
2014-03-06 10:05:56
2014-04-29 16:04:30
2014-04-29 17:22:13
2014-05-02 10:35:02
2014-05-07 18:09:23

现在我需要比较以上所有内容以找到最近的日期,以便我可以再次使用正则表达式从日志文件中提取包含最近日期的整行

更新:

my @dates = $1 if (/^(.*)\|Info\|(.*) port (.*)/);
my ($min) = sort @dates;
my ($max) = reverse sort @dates;
print "Max = $max\nMin = $min\n"

@Miller 和 @choroba 建议的代码的输出

Max = 2014-04-09 13:55:50
Min = 2014-04-09 13:55:50
Max = 2014-05-07 18:09:23
Min = 2014-05-07 18:09:23

我真正需要的输出

Recent Start Time: 2014-05-07 18:09:23

【问题讨论】:

    标签: perl date time compare


    【解决方案1】:

    对于这种格式的日期,您可以使用纯字符串比较(cmpltgt 等)。

    my ($min, $max) = @dates;
    for (@dates) {
        $min = $_ if $min gt $_;
        $max = $_ if $max lt $_;
    }
    

    【讨论】:

    • 我收到错误Use of uninitialized value $max in string lt请查找代码更新my @dates = $1 if (/^(.*)\|Info\|(.*) port (.*)/); my ($min, $max) = @dates; for (@dates) { $min = $_ if $min gt $_; $max = $_ if $max lt $_; } print "$min \n $max";
    • @AbilashA:这是不对的。数组@dates 应该是“包含先前使用正则表达式提取的日期的数组”,只有当该数组包含少于两个日期时,您才会得到Use of uninitialized value,在这种情况下问题是微不足道的。无论如何,您的代码将只定义$min,而$max 仍然是未定义的。
    • @Borodin,你能帮我让数组包含所有日期吗?是否可以将一个数组值分配给另一个?
    • @AbilashA:是的,我可以,但我不知道你的数据是什么样的。它在一个文件中吗?至于“是否可以将一个数组值分配给另一个?” 是的,当然可以,但我不明白这与这个问题有什么关系。
    【解决方案2】:

    假设您的@dates 数组不是很大,在这种情况下sort 将是一种放纵,您可以只写

    my ($min, $max) = (sort @dates)[0,-1];
    

    【讨论】:

      【解决方案3】:

      只需sort您的日期,因为您的数据恰好采用易于排序的格式。

      use strict;
      use warnings;
      
      my @dates = split /\n/, do {local $/; <DATA>};
      
      my ($min, $max) = (sort @dates)[0, -1];
      
      print "Max = '$max'\nMin = '$min'\n";;
      
      __DATA__
      2014-03-05 18:22:06
      2014-03-06 10:05:56
      2014-04-29 16:04:30
      2014-04-29 17:22:13
      2014-05-02 10:35:02
      2014-05-07 18:09:23
      

      输出:

      Max = '2014-05-07 18:09:23'
      Min = '2014-03-05 18:22:06'
      

      【讨论】:

      • 感谢您的快速回复,实际上我不会将日期写入文件并从中读取,而是将所有数据放入数组中
      • 为什么不只是chomp(my @dates = &lt;DATA&gt;),然后是my ($min, $max) = (sort @data)[0,-1]
      • @Miller,我尝试跳过该行,但比较不适用于整个数组,而是适用于每个数组元素,因此将每个值打印两次(最大值和最小值),您能否指出我在哪里犯了错误,我已经更新了问题中的脚本部分
      • @AbilashA 您的行 my @dates = $1 if (/^(.*)\|Info\|(.*) port (.*)/); 仅将单个值分配给您的 @dates 数组。你看出其中的问题了吗?
      • @Miller,是的,你是对的,但是我该如何解决这个问题,有没有办法将整个结果分配给数组并进一步处理?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多