Как получить выходные данные внешней команды в Perl-скрипте?

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

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


person Anil    schedule 15.04.2009    source источник


Ответы (6)


Если я правильно понимаю, вы хотите, чтобы 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 и т. д.), но Я считаю, что вышеперечисленного должно быть достаточно.

person dsm    schedule 15.04.2009
comment
IPC::Open3, вероятно, является излишним, программа выдает данные в STDOUT (не STDERR) и принимает имя входного файла в качестве аргумента (поэтому нет необходимости возиться со STDIN). Простого открытия достаточно, и с ним намного легче работать. - person Chas. Owens; 15.04.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;
person Chas. Owens    schedule 15.04.2009

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

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

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

person Ed Guiness    schedule 15.04.2009

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

my $result = qx{TET.EXE some.pdf some params};
person Hynek -Pichi- Vychodil    schedule 15.04.2009

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

person Chris Dolan    schedule 16.04.2009

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

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

person brian d foy    schedule 16.04.2009