我有一个数组:
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")
我想不出一个简单的方法来做到这一点...我正在考虑使用一些正则表达式来比较字符串(/\".*\"/)并让它删除它找到的重复项,但我'我不知道如何处理日期/时间。
欢迎任何建议!
答案 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并查看它是否有效。
提取日期也是一项练习。