我想写一个 perl 程序,该程序读取文件并提取其中的日期。但是,如果日期超过一次,我将只打印一次。例如:
On 01/10/2011 I went home. On 02/02/2012, I
went to my school. On 02/02/2012, I went
to London.
输出应为:
01/10/2011
02/02/2012
我可以通过将日期添加到数组并在每次读取新日期时控制它来实现。但我要求更有效的方式。有合理的方法吗?或 perl 中的任何数据结构?
答案 0 :(得分:2)
它将逐行扫描,以\d\d/\d\d/\d{4}
格式查找日期,并将其作为键保存在哈希中。
文件读取完成后,会打印这些唯一键。
perl -nE '$s{$_}++ for m| (\d\d/\d\d/\d{4}) |xg;}{say for sort keys %s' file
它可以被翻译成更易读的形式(加上一些支票)
use strict;
open my $fh, "<", "file" or die $!;
my %s;
while (my $line = <$fh>) {
my @dates = $line =~ m| (\d\d/\d\d/\d{4}) |xg;
for my $date (@dates) {
$s{$date} += 1;
}
}
for my $date (sort keys %s) {
print $date, "\n";
}
答案 1 :(得分:0)
如果您愿意安装模块来执行此操作(我知道它似乎有点矫枉过正)List::MoreUtils
有一个uniq
方法。每个人都避开你的眼睛......这是星期五下午,非常炎热,可能是时候啜饮(-0777
)啤酒:
perl -'MList::MoreUtils qw(uniq)' -0777nE '@dates = m|(\d\d/\d\d/\d{4})|xg ; @x = uniq(@dates); say "@x" ' file.txt
抱歉; - )