Perl — нужно вызывать system (‘diff’) снова и снова

#perl #system #diff

#perl #система #diff

Вопрос:

У меня есть система пакетной обработки, которая должна запускать одну и ту же команду оболочки снова и снова.

 while (x)
{
  if (y)
  {
    $diff = `diff $f1 $f2`;
    ...
  }
  else
  {
    ...
...
  

Это немного медленно, поэтому мне интересно, есть ли какой-нибудь способ сделать оболочку или программу постоянными (или что-то в этом роде), чтобы у нее не было больших накладных расходов каждый раз.

Обратите внимание, что я не могу рассматривать возможность написания собственной diff функции, поскольку фактический вывод должен выглядеть так, как будто он был получен из этой программы.

Заранее спасибо!

Ответ №1:

Мне интересно, есть ли какой-нибудь способ сделать оболочку или программу постоянной (или что-то в этом роде), чтобы каждый раз не было больших накладных расходов.

Не совсем. diff это своего рода одноразовый инструмент; у него нет постоянного режима.

Однако, возможно, вам захочется взглянуть на модуль Text::Diff . Он может генерировать выходные данные в том же формате, diff что и утилита.

Комментарии:

1. Алгоритм ::Diff выполняет работу для Text::Diff, и он написан на Perl. Это не будет быстрее

2. @ikegami Существует также алгоритм::Diff::Xs

3. @ikegami Если все файлы действительно маленькие, выполнение сравнения в процессе все равно может быть улучшением. Это было бы особенно верно, если OP находится в операционной системе, которая медленно запускает процессы, такие как Windows.