Как я могу быстро найти первую строку файла, которая соответствует регулярному выражению? - PullRequest
5 голосов
/ 13 декабря 2008

Я хочу найти строку в файле, используя регулярные выражения, внутри скрипта Perl.

Предполагается, что в системе с установленным grep лучше:

  • вызов внешнего grep с помощью команды open()
  • open() файл напрямую и используйте цикл while и if ($line =~ m/regex/)?

Ответы [ 7 ]

9 голосов
/ 13 декабря 2008

В современной реализации Perl код регулярного выражения должен быть таким же быстрым, как и в grep, но если вы беспокоитесь о производительности, почему бы вам просто не попробовать его? С точки зрения чистоты кода и надежности, вызов внешнего инструмента командной строки определенно не годится.

6 голосов
/ 13 декабря 2008

Вам не нужно явно open файл.

my $regex = qr/blah/;
while (<>) {
  if (/$regex/) {
    print;
    exit;
  }
}
print "Not found\n";

Так как вы, похоже, обеспокоены производительностью, я позволю совпадению и print используем значение по умолчанию $_, не назначая <> чему-либо, что немного быстрее. В нормальном производственном коде,

while (my $line = <>) {
  if ($line =~ /$regex/) {
    print $line;
    exit;
  }
}

было бы предпочтительным.

Редактировать: Предполагается, что проверяемый файл указан в командной строке, что, как я только что заметил, вы не указали, применимо в вашем случае.

5 голосов
/ 13 декабря 2008

С grep нужно быть осторожным: в последних дистрибутивах Linux, если ваша переменная среды LANG определяет тип UTF-8 (например, у меня есть LANG = en_GB.UTF-8), тогда grep, sed, sort и, возможно, куча других текстовых утилит работают примерно в 10 раз медленнее. Так что следите за этим, если вы проводите сравнение производительности. Теперь я использую псевдоним моей команды grep:

LANG= LANGUAGE= /bin/grep

Редактировать: На самом деле это больше похоже на 100 раз медленнее

3 голосов
/ 14 декабря 2008

Это зависит. Если вы хотите оптимизировать время разработки,

$line = `grep '$regex' file | head -n 1`;

это то, что нужно делать.

Но это происходит за счет необходимости запуска внешних процессов, в зависимости от того, что установлено помимо perl, и потери возможности делать подробные отчеты об ошибках, когда что-то идет не так.

3 голосов
/ 13 декабря 2008

Это зависит.

  • работа внутри Perl экономит ваше время запуска процесса и другие связанные с этим затраты ресурсов.
  • grep, вероятно, быстрее, чем выполняет ту же работу в Perl, но не так сильно.

Я бы сказал, что делать это в Perl, если производительность не заставляет вас оптимизировать.

2 голосов
/ 01 апреля 2010
sed '/pattern/q' file
1 голос
/ 15 декабря 2008

Однажды я написал скрипт для поиска некоторых регулярных выражений в больших текстовых файлах (около 10 МБ каждый). Я сделал это с регулярными выражениями Perl, и заметил, что это идет довольно медленно. Поэтому я попытался запустить grep из скрипта, и повышение скорости было довольно значительным. Итак, по моему опыту, встроенные в Perl регулярные выражения работают медленнее, чем grep. Но вы, вероятно, заметите это только с большими файлами. Мой совет: попробуйте оба пути, и посмотрите, как это будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...