Поиск строки в нескольких файлах с использованием Perl - PullRequest
0 голосов
/ 30 сентября 2018

Новичок в Perl!нужна помощь :) У меня есть 2 файла размером почти 500 КБ каждый.

И мне нужно найти набор строк (около 800 строк) в этих файлах, чтобы проверить, присутствует ли строка в файле 1, файл2 или в обоих или ни в одном из них.

Единственная известная мне опция - это открыть файл1, прочитать строку за строкой и проверить, присутствует ли в нем строка и сделать то же самое с файлом2.Выполнение всего процесса для почти 800 строк (строк поиска) не кажется ни хорошим, ни эффективным.

Есть ли другая альтернатива, которая является более эффективной, или однострочный код для нее с использованием PERL?

1 Ответ

0 голосов
/ 30 сентября 2018

Вот пример использования Regexp::Assemble.Предполагая, что строки для сопоставления не занимают несколько строк, он создает общее регулярное выражение для всех строк, которые можно проверить для каждой строки.Следовательно, файлы нужно прочитать только один раз.

use feature qw(say);
use strict;
use warnings;
use Regexp::Assemble;

my @strings = qw(abc efg);  # <- Add more strings here

my $ra = Regexp::Assemble->new;
$ra->add( $_ ) for @strings;  # <- Creates a regexp that matches all the strings..
my $re = $ra->re;
my @files = qw(file1.txt file2.txt);  # <- Add more files if needed..
my @matches;
for my $file (@files) {
    push @matches, get_matches( $file, $re );
}
# Now post process the matches as you like..

sub get_matches {
    my ( $fn, $re ) = @_;

    my %matches;
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    while (my $line = <$fh>) {
        while ( $line =~ /($re)/g ) {
            $matches{$1}++;
        }
    }
    close $fh;
    return \%matches;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...