你沒有說你的$command
什麼,但這對我很有用。
use warnings 'all';
use strict;
use IPC::Open2;
my $host = 'google.com';
my $pid = open2(\*RDR, \*WTR, "telnet $host 80 2>&1")
or die "Can't contact $host: $!";
print WTR "GET\n";
print WTR "quit\n";
while (my $line = <RDR>)
{
print $line if $. <= 10; # print only first 10 lines
}
close RDR;
waitpid($pid, 0);
my $child_exit_status = $? >> 8; # check how it went
這打印整個頁面(沒有if ...
)。爲方便起見,打印限制爲10行。
請仔細閱讀文檔IPC::Open2,因爲所有這些都涉及到。
open2()
返回子進程的進程ID。
open2()
在退出後不等待並收穫子進程。 [...]
這整個事情是相當危險的,因爲你可能永遠阻止。 [...]
另請參閱IPC::Open3。一個備受好評的模塊是IPC::Run,如果可能的話已經安裝。 Tiny::Capture也非常出色,在this recent post中看到一個非常類似的問題。兩者都非常有名,所以你的管理員可以接受他們。
我建議切換到詞法文件句柄
my $pid = open2 my $read_fh, my $write_fh, "telnet $host 80 2>&1"
or die "Can't contact $host: $!";
,改變RDR
和WTR
貫穿始終。
我不知道Windows環境如何影響上述。模塊會給一些信心,但我不知道如何open2
票價。另一個可能的罪魁禍首可能是緩衝,即使我沒有看到它是如何在你的代碼。爲了以防萬一,你可以嘗試
的IO::Handle
默認情況下從,我認爲,v5.16開始加載。
也有關於這個in perlfaq5的討論,有進一步閱讀的鏈接。
但是,如果您確實有緩衝問題,那麼最有可能在另一端,如果沒有模塊,解決方案可能並不容易。從駱駝
如上所述,IO::Pty
和Expect
模塊提供一個僞終端設備引述,給您線緩衝,而無需修改在管的端部的方案。
非常感謝。這對我有效。 – user7030551