Удалить строки, которые содержат повторяющиеся регулярные выражения в Perl - PullRequest
1 голос
/ 23 февраля 2012

У меня есть массив, который содержит такие элементы, как:

@array = qw/ john jim rocky hosanna/;

ФАЙЛ ВВОДА:

john wears blue shirt 

hosanna knows drawing

george and jim went to europe

john went to swimming

jim wears yellow shirt

rocky went to swimming

rocky learns painting

hosanna learns painting

ТРЕБУЕМЫЙ ВЫХОД:

john wears blue shirt 

hosanna knows drawing

george and jim went to europe

rocky went to swimming

, поэтому мне нужноиметь только первые строки вхождений.

Ответы [ 4 ]

4 голосов
/ 23 февраля 2012
@seen{@array} = ();
@out = grep { (($w)=split; !($seen{$w}++) } @in;
1 голос
/ 18 апреля 2013
perl -ane 'print unless $a{$F[0]}++ ' inputfile

надеюсь, что это работает +

1 голос
/ 23 февраля 2012

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

Содержимое script.pl:

use warnings;
use strict;

## Input names to search.
my @array = qw/ john jim rocky hosanna/;

## Save names to a hash. This way they are easier to find out.
my %names = map { $_ => 1 } @array;

## Read file line by line.
while ( <> ) { 

    ## Avoid blank lines.
    next if m/\A\s*\Z/;

    ## Split line in fields.
    my @f = split;

    ## Count number of names in hash.
    my $num_entries = scalar keys %names;

    ## Remove words of hash found in line.
    for ( @f ) { 
        delete $names{ $_ };
    }   

    ## If now there are less names, it means that line had any of
    ## them, so print line.
    if ( scalar keys %names < $num_entries ) { 
        printf qq[%s\n], $_; 
    }   

    ## If hash is empty, there are no lines left to print, so exit of
    ## loop without checking more lines.
    last if scalar keys %names == 0;
}

Команда:

perl script.pl infile

Выход:

john wears blue shirt 

hosanna knows drawing

george and jim went to europe

rocky went to swimming
1 голос
/ 23 февраля 2012

Как насчет создания другого массива, который указывает, было ли имя уже использовано?Затем, когда вы впервые прочитаете строку с помощью Jim, установите переменную в этом массиве как используется и запишите в вывод.Если он уже использовался в прошлом, ничего не делать.

@array =(john,jim,rocky,hosanna);
@used =(0,0,0,0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...