2009-04-15 54 views
3

我有一個名爲TET.EXE的工具,PDFlib家族的產品,它用於提取特定文本的座標。在Perl腳本中使用這些座標,我們可以提取所需的文本。這是一個手動的過程來運行.EXE,然後把座標給Perl,所以任何人都可以建議我讓整個過程完成。如何從Perl腳本中的外部命令中收集輸出?

我的意思是Perl腳本本身應運行.EXE並獲取所需的座標並提取文本。在linux中用來運行這個perl腳本的命令是什麼? 請,我需要你的建議以下。
在此先感謝。

回答

10

如果我理解正確的,你想要Perl來啓動一個可執行文件,並做印刷到標準輸出文本的東西....在這種情況下,有幾個選擇:

Using backticks

my $output = `TED.EXE`; 

這使得在變量$輸出TED.EXE命令的輸出,並且是最有可能夠你所需要的。

using IPC::Open3

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

這將運行您的命令和同事$ WTR,$ RDR和$犯錯的標準輸入,輸出和錯誤流。

還有其他方法可以做你想做的事(Expect.pm,Run3等),但我相信上面提到的應該足夠了。

+0

IPC :: Open3可能是矯枉過正的,程序吐出STDOUT(而不是STDERR)上的數據,並將輸入文件名作爲參數(因此不需要混淆STDIN)。簡單的打開就足夠了,而且更容易處理。 – 2009-04-15 14:16:14

2

如果TET.EXE輸出到控制檯如果你想了解它,你可以捕捉

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

該輸出,搜索「perl的反引號」

2

我不明白的問題,但可能是:

my $result = qx{TET.EXE some.pdf some params}; 
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; 
0

perlipc文檔顯示了許多與Perl的外部進程進行交互的方式。

許多人告訴你使用反引號,但你也可以檢查出IPC::System::Simple,它提供了更強大的方法來處理操作系統特定的怪癖,做同樣的事情。

相關問題