Было бы полезно, если бы вы могли более подробно объяснить, что вы пытаетесь выполнить. Я думаю, что это суммирует это: у вас есть файл «проверки», содержащий строки и файл «значений», содержащий шаблоны; если какой-либо заданный образец «значений» находится в «проверке», распечатайте исходную строку для вывода. Если шаблон не найден, распечатайте исходную строку до ошибки.
Что вы хотите, чтобы «общее количество» означало? Сейчас это означает, что общее количество шаблонов в «значениях» соответствует, а не общее количество строк в «проверке». Частью вашей проблемы с эффективностью является то, что вы продолжаете проверять шаблоны после того, как строка уже сопоставлена. Это по дизайну или это ошибка, которую мы можем исправить?
Действительно ли вы выполняете сопоставление с образцом или простое сравнение строк? Последний открывает несколько разных вариантов того, как мы можем это сделать. «Проверяет» файл 10 МБ или «значения»? В общем, вы должны выбрать более крупный файл как «управляющий» вход, а только читать вход без ввода в память.
use strict;
use warnings;
open(OUT, '>', 'Correct.txt')
or die "unable to open Correct.txt for writing: $!\n";
open(ERR, '>', 'ERROR_Report.txt')
or die "unable to open ERROR_Report.txt for writing: $!\n";
# File1.txt contains patterns for matching
open(PATTERNS, '<', 'File1.txt')
or die "unable to open File1.txt for reading: $!\n";
# Read in patterns and remove trailing CRLF
chomp(my @patterns = <PATTERNS>);
my $pattern = join '|', @patterns;
# Compute a single regex with all the patterns
my $pattern_re = qr/$pattern/;
close(PATTERNS);
# File2.txt contains lines to check for patterns
open(LINES, '<', 'File2.txt')
or die "unable to open File2.txt for reading: $!\n";
my $count = 0;
while (my $line = <LINES>) {
# Remove trailing CRLF
chomp;
if ($line =~ $pattern_re) {
print OUT $line."\r\n";
$count++;
}
else {
print ERR $line."\r\n";
}
}
close(LINES);
print OUT "Total matching lines: $count\r\n";
* Always * 'use strict; использовать предупреждения; '! (И немного OT; хорошее чтение: http://eev.ee/blog/2011/04/13/perl-worst-practices) – Biffen
Интересно, почему массив «rep» s называется '@ values' ? – ikegami
Если вы пытаетесь использовать строки, общие для обоих файлов, и строки, которые находятся в одном файле, но не в другом, попробовали ли вы использовать Unix comm (1) [http://linux.die.net/man/1/comm]? – mwp