Как я могу удалить определенные дубликаты с Tie :: File? - PullRequest
2 голосов
/ 24 июня 2010

Я использую этот код для удаления всех дубликатов, но мне нужно удалить только определенные дубликаты и оставить все остальные без изменений.

В моем случае, если строка соответствует /^\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 ]

1 голос
/ 24 июня 2010
@lines = ( $array[0],
             grep { not /^\s+INDEX 00 \d\d:\d\d:\d\d$/ } @lines[1..$#lines] );

Объяснение

  • Срез массива используется для игнорирования первого элемента при фильтрации с помощью grep
  • grep фильтрует все элементы, которые не соответствуют регулярному выражению
  • Результирующий массив присваивается @lines
1 голос
/ 24 июня 2010
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...