3

我想编写一个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中的任何数据结构?

4

2 回答 2

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";
}
于 2013-05-31T14:48:49.877 回答
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

对不起 ;-)

于 2013-05-31T20:30:23.343 回答