如何从Perl脚本中的外部命令收集输出?

时间:2009-04-15 11:29:28

标签: perl pdf pdflib

我有一个名为TET.EXE的工具,它是PDFlib系列的产品,用于提取特定文本的坐标。在Perl脚本中使用这些坐标,我们可以提取所需的文本。这是一个运行.EXE的手动过程,然后将坐标给Perl,所以任何人都可以建议我完成整个过程。

我的意思是Perl脚本本身应运行.EXE并获取所需的坐标并提取文本。在linux中使用哪些命令来运行这个perl脚本? 请,我需要你的建议如下 提前谢谢。

6 个答案:

答案 0 :(得分:10)

如果我理解正确,你希望perl启动一个可执行文件并使用打印到stdout的文本执行某些操作....在这种情况下,有几个选项:

Using backticks

my $output = `TED.EXE`;

这会将TED.EXE命令的输出放在变量$ output中,并且很可能足以满足您的需要。

using IPC::Open3

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

这将运行您的命令并将$ wtr,$ rdr和$ err与标准输入,输出和错误流相关联。

还有其他方法可以做你想要的事情(Expect.pmRun3等),但我相信上面提到的就足够了。

答案 1 :(得分:6)

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 :(得分:2)

如果TET.EXE输出到控制台,您可以使用

捕获该输出
my $tetOutput = `tet.exe /myoptions`;

如果您想了解它,请搜索“perl backtick”

答案 3 :(得分:2)

我不明白问题,但可能是:

my $result = qx{TET.EXE some.pdf some params};

答案 4 :(得分:1)

您可能还会考虑另一种方法:use a Perl library to extract the coordinates

答案 5 :(得分:0)

perlipc文档显示了许多与Perl的外部进程交互的方法。

许多人告诉你使用反引号,但你也可以查看IPC::System::Simple,它通过处理特定于操作系统的怪癖提供更强大的方法来做同样的事情。