Как собрать выходные данные из внешней команды в сценарии Perl? - PullRequest
3 голосов
/ 15 апреля 2009

У меня есть инструмент с именем TET.EXE, продукт семейства PDFlib, он используется для извлечения координат конкретного текста. Используя эти координаты в скрипте Perl, мы можем извлечь необходимый текст. Это ручной процесс запуска .EXE с последующим предоставлением Perl координат, поэтому любой может предложить мне отключить весь этот процесс.

Я имею в виду, что сам скрипт Perl должен запускать .EXE, получать необходимые координаты и извлекать текст. Какие команды будут использоваться в Linux для запуска этого сценария Perl? Пожалуйста, мне нужны ваши предложения для следующего.
Заранее спасибо.

Ответы [ 6 ]

10 голосов
/ 15 апреля 2009

Если я правильно понимаю, вы хотите, чтобы perl запустил исполняемый файл и сделал что-то с текстом, напечатанным на стандартный вывод .... в этом случае есть несколько вариантов:

Использование обратных галочек :

my $output = `TED.EXE`;

Это помещает выходные данные команды TED.EXE в переменную $ output и, скорее всего, достаточно для того, что вам нужно.

с использованием IPC :: Open3 :

use IPC::Open3;
my($wtr, $rdr, $err);
my $pid = open3($wtr, $rdr, $err,
                'some cmd and args', 'optarg', ...);

Запускает вашу команду и связывает $ wtr, $ rdr и $ err со стандартными потоками ввода, вывода и ошибок.

Есть и другие способы сделать то, что вы хотите ( Expect.pm , Run3 и т. Д.), Но я считаю, что вышеупомянутого должно быть достаточно.

6 голосов
/ 15 апреля 2009

Perl предоставляет множество методов для запуска внешней программы и сбора ее вывода. Основываясь на взгляде на tet.exe, я бы сказал, что вам лучше всего использовать функцию open и циклически перебирать выходные данные с помощью регулярного выражения, чтобы найти координаты:

open my $pdftext, "-|", "/path/to/tet.exe", "--text", $pdffile
    or die "could not open $pdffile using tet.exe: $!";

my ($x, $y);
while (my $line = <$pdftext>) {
    last if ($x, $y) = $line =~ /regex that matches the coords/;
}
die "file did not contain coordinates" unless defined $x;
2 голосов
/ 15 апреля 2009

Я не понимаю вопроса, но может быть:

my $result = qx{TET.EXE some.pdf some params};
2 голосов
/ 15 апреля 2009

Если TET.EXE выводит на консоль, вы можете записать этот вывод с помощью

my $tetOutput = `tet.exe /myoptions`;

Если вы хотите прочитать об этом, найдите 'perl backtick'

1 голос
/ 16 апреля 2009

Вы могли бы также рассмотреть другой подход: использовать библиотеку Perl для извлечения координат .

0 голосов
/ 16 апреля 2009

Документация perlipc показывает множество способов взаимодействия с внешними процессами из Perl.

Многие люди советуют вам использовать обратные галочки, но вы также можете проверить IPC :: System :: Simple , который предоставляет более надежные способы сделать то же самое, обрабатывая специфические особенности операционной системы.

...