如何使用Tie :: File删除特定的重复项?

时间:2010-06-24 17:48:11

标签: perl

我正在使用此代码删除所有重复项,但我需要仅删除特定的重复项并保持其他所有副本不受影响。

在我的情况下,如果该行匹配/^\s+INDEX 00 \d\d:\d\d:\d\d$/,则保留每个唯一的第一行,但删除重复项,并保留所有与正则表达式不匹配的行。

tie my @lines, 'Tie::File', $fn or die "could not tie file: $!";
my %seen;
@lines = grep(!$seen{$_}++, @lines);
untie @lines;

2 个答案:

答案 0 :(得分:1)

tie my @lines, 'Tie::File', $fn or die "could not tie file: $!";
my %seen;
@lines = grep(!/^\s+INDEX 00 \d\d:\d\d:\d\d$/ || !$seen{$_}++, @lines);
untie @lines;

答案 1 :(得分:1)

@lines = ( $array[0],
             grep { not /^\s+INDEX 00 \d\d:\d\d:\d\d$/ } @lines[1..$#lines] );

解释

  • 使用grep
  • 进行过滤时,将使用数组切片忽略第一个元素
  • grep过滤掉与正则表达式
  • 不匹配的所有元素
  • 结果数组已分配给@lines