在Perl中按字符串当前日期排序字符串+日期

时间:2015-01-28 20:36:45

标签: perl

我有一个数组:

my @array = ( "\"Passing\" on Wed 12 Jan 2015 09:19:14 AM PST", 
              "\"Passing\" on Wed 12 Jan 2015 09:19:25 AM PST", 
              "\"Test Activation\" on Tues 14 Jan 2015 12:05:14 PM PST", 
              "\"Run Phase\" on Tues 14 Jan 2015 12:06:14 PM PST",
              "\"Test Activation\" on Tues 13 Jan 2015 11:43:12 PM PST")

我想删除重复的字符串行但保留最新的字符串。所以我希望它看起来像:

       my @array = ("\"Passing\" on Wed 12 Jan 2015 09:19:25 AM PST", 
                   "\"Test Activation\" on Tues 14 Jan 2015 12:05:14 PM PST", 
                   "\"Run Phase\" on Tues 14 Jan 2015 12:06:14 PM PST")

我想不出一个简单的方法来做到这一点...我正在考虑使用一些正则表达式来比较字符串(/\".*\"/)并让它删除它找到的重复项,但我'我不知道如何处理日期/时间。

欢迎任何建议!

1 个答案:

答案 0 :(得分:5)

有几种方法可以解析和比较日期。最简单的方法是使用内置的Time::Piece。使用strptime进行解析并与$time->epoch进行比较。

不幸的是,abbreviated time zone names are ambiguous。 PST可以表示美国太平洋标准时间或菲律宾标准时间。这可能导致strptime的%Z格式窒息,YMMV。从我的strptime手册页......

  

%Z格式说明符仅接受本地时区的时区缩写或值“GMT”。这种限制是由于时区缩写的过度加载导致的模糊性。其中一个例子是东部标准时间和澳大利亚东部夏令时的EST。

您可能需要预处理日期格式并将其转换为时区偏移。你可以使用Time::Zone来表明这一点及其明显的北美倾向。

use Time::Zone;
use Time::Piece;

my $offset = sprintf "%+d", (tz_offset("PST") / 60 / 60);

my $time = Time::Piece->strptime(
    "Wed 12 Jan 2015 09:19:14 AM $offset",
    "%a %d %b %Y %I:%M:%S %p %z"
);
print $time->datetime, "\n";
print $time->epoch, "\n";

但首先尝试%Z并查看它是否有效。

提取日期也是一项练习。