我是Perl的新手,需要帮助使用散列和/或任何其他可能的方法进行排序,这可以在Perl中完成。
我有一个像下面这样的输入文件,想要生成输出文件,如图所示。
我在想是否可以通过将其置于哈希然后进行比较来完成?如果可能,请同时解释学习目的的步骤。
如果文件具有与不同时间戳匹配的重复/重复条目,则它应仅列出最新的时间戳条目。
输入文件
A May 19 23:59:14 B May 19 21:59:14 A May 22 07:59:14 C Apr 10 12:23:00 B May 11 10:23:34
输出应为
A May 22 07:59:14 B May 19 21:59:14 C Apr 10 12:23:00
答案 0 :(得分:1)
您可以尝试将数据(A,B等)用作密钥和时间戳作为perl哈希值。 然后读取输入文件并使用perl time数据类型比较时间戳。这样您只保留最新的条目,其他条目可以丢弃。最后打印结果。
答案 1 :(得分:1)
散列适用于合并重复项。
但是,按时间戳排序需要将“文本”表示转换为实际时间。 Time::Piece
是执行此操作的更好选择之一
#!/usr/local/bin/perl
use strict;
use warnings;
use Time::Piece;
my %things;
while (<DATA>) {
my ( $letter, $M, $D, $T ) = split;
my $timestamp =
Time::Piece->strptime( "$M $D $T 2015", "%b %d %H:%M:%S %Y" );
if ( not defined $things{$letter}
or $things{$letter} < $timestamp )
{
$things{$letter} = $timestamp;
}
}
foreach my $thing ( sort keys %things ) {
print "$thing => ", $things{$thing}, "\n";
}
__DATA__
A May 19 23:59:14
B May 19 21:59:14
A May 22 07:59:14
C Apr 10 12:23:00
B May 11 10:23:34
请注意 - 您的时间戳不明确,因为它们省略了年份。你必须以某种方式处理这个问题。我已经走了简单的插入2015年的道路。这不是一个好的做法 - 至少你应该使用某种方式自动发现'当年' - 但请记住,在一年中的某些时候,这将是Just打破。
您可以使用strftime
中的Time::Piece
方法格式化输出日期 - 这只是默认输出。