Ваш вопрос оставляет нам угадывание многих вещей, но лучший общий подход, казалось бы, открывает файл только один раз и обрабатывает каждую строку в самом Perl.
open(F, "zcat $file_list |") or die "$0: could not zcat: $!\n";
LINE:
while (<F>) {
######## FIXME: this could be optimized a great deal still
foreach my $i (@contact_list) {
if (m/$i/) {
print $_;
next LINE;
}
}
}
close (F);
Если вы хотите выжать больше из внутреннего цикла, компиляция регулярных выражений из @contact_list
в отдельный массив перед петлей, или, возможно, объединить их в единое регулярное выражение, если все, что вы заботитесь о том, является ли один из них соответствует. Если, с другой стороны, вы хотите распечатать все совпадения для одного шаблона только в конце, когда знаете, что это такое, собирайте совпадения в один массив для каждого выражения поиска, затем зацикливайте их и распечатайте, когда у вас есть grepped весь набор входных данных файлы.
Ваша проблема не воспроизводится без информации о том, что находится в $i
, но я могу догадаться, что она содержит некоторый метасимвол оболочки, который заставляет его обрабатывать оболочку перед запуском grep
.
Это редактировать резюме должен был читать «Пожалуйста, обратите внимание на уценку, когда вы добавляете код в свой ответ». Кроме того, добро пожаловать в переполнение стека. – simbabque
Что в переменных? Почему вы не используете 'zgrep'? – tripleee
Если входы большие (как предлагает формат на молнии), получение всех совпадений за один раз кажется лучшим подходом. – tripleee