[英]Trouble with IPC::Open3
我正在使用IPC :: Open3編寫一個簡單的腳本。 該腳本不會向stdout或stderr產生任何輸出,而我希望兩者都輸出。
完整的源代碼:
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use IPC::Open3;
pipe my $input, my $output or die $!;
my $pid = open3(\*STDIN, $output, \*STDERR, 'dd', 'if=/usr/include/unistd.h') or die $!;
while(<$input>) {
print $_."\n";
}
waitpid $pid, 0;
我可以肯定我使用的IPC :: Open3錯誤。 不過,我仍然困惑,我應該做的。
是pipe
。 不知道為什么會在那里,我不能說更多。 這很好。
my $reader;
my $pid = open3(\*STDIN, $reader, \*STDERR, 'dd', 'if=/usr/include/unistd.h') or die $!;
while(<$reader>) {
print $_."\n";
}
waitpid $pid, 0;
我意識到這可能只是一個例子,但萬一不是……這完全是您正在做的事。 您可以使用反引號來實現。
print `dd if=/usr/include/unistd.h`
IPC :: Open3有點復雜。 有更好的模塊,例如IPC :: Run和IPC :: Run3 。
use strict;
use warnings;
use IPC::Run3;
run3(['perl', '-e', 'warn "Warning!"; print "Normal\n";'],
\*STDIN, \*STDOUT, \*STDERR
);
您的程序存在以下問題:
\\*STDIN
(打開的STDIN
作為連接到孩子的STDIN
的管道)應為<&STDIN
(使用父母的STDIN
作為孩子的STDIN
)。 \\*STDERR
(將STDERR
作為連接到孩子的STDERR
的管道打開)應為>&STDERR
(將父級的STDERR
用作孩子的STDERR
)。 $output
的值將被忽略和覆蓋。 幸運的是,它被正確的值覆蓋! print $_."\\n";
,但$_
已經以換行符結尾。 要么先chomp
,要么不添加換行符。 open3
不是系統調用,因此不會設置$!
。 open3
不會在錯誤時返回false; 它會引發異常。 因此,我們得到如下信息:
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw( say );
use IPC::Open3;
my $pid = open3('<&STDIN', my $output, '>&STDERR',
'dd', 'if=/usr/include/unistd.h');
while (<$output>) {
chomp;
say "<$_>";
}
waitpid($pid, 0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.