Как эффективно отфильтровать строки ввода по массиву данных? - PullRequest
0 голосов
/ 31 января 2011

Я пытаюсь прочитать файл во временную переменную, фильтруя файл по элементам в массиве.Я делаю это, открывая файл и в цикле while чтения файла, запускаю другой цикл (очень плохая идея IMO), чтобы проверить, соответствует ли содержимое массиву, если так, то строка отбрасывается и переходит к следующемуline.

Работает, но плохо, когда есть 20 000 строк ввода.Я читаю с массивом из 10 элементов, который, по сути, превращает его в файл с 200 000 строк.

Есть ли способ обработать это быстрее?

Ответы [ 2 ]

1 голос
/ 31 января 2011

Если вы хотите удалить строку, если какой-либо элемент в вашем массиве найден, функция any из List :: MoreUtils прекратит поиск в массиве, как только найдет совпадение.

use List::MoreUtils qw(any);

while (<>) {
    my $line = $_;
    next if any { $line =~ /$_/ } @list;
    # do your processing
}

Если вы знаете, какие элементы в вашем массиве чаще встречаются в ваших строках, вы можете соответствующим образом отсортировать массив.

Вам также следует Benchmark ваши подходы, чтобы убедиться, что ваши усилия по оптимизации того стоят.

1 голос
/ 31 января 2011

Смешайте элементы массива в большое регулярное выражение: например, если ваш массив qw{red white green}, используйте /(red|white|green)/. Переменная $1 скажет вам, какая из них соответствует. Если вам нужно точное соответствие, закрепите конечные точки: /^(red|white|green)$/.

...