Perl open3命令的语法
根据Perl open3命令的语法,perl,Perl,根据IPC::Open3::Open3的语法是 $pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, 'some cmd and args', 'optarg', ...); 我对前三个参数感到困惑。这些是对typeglobs的引用吗 我尝试了以下方法: my$pid=open3(“STDIN”、“STDOUT”、“STDERR”和$cmd) my$pid=open3(*STDIN,*STDOUT,*STDERR,$cmd) my$pid=open3(
IPC::Open3::Open3
的语法是
$pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, 'some cmd and args', 'optarg', ...);
我对前三个参数感到困惑。这些是对typeglobs的引用吗
我尝试了以下方法:
my$pid=open3(“STDIN”、“STDOUT”、“STDERR”和$cmd)代码>
my$pid=open3(*STDIN,*STDOUT,*STDERR,$cmd)代码>
my$pid=open3(\*STDIN,\*STDOUT,\*STDERR,$cmd)代码>
my$pid=open3('&STDOUT','>&STDERR',$cmd)代码>
use warnings;
use strict;
use feature qw(say);
use IPC::Open3;
my $cmd="sleep 1; echo This STDOUT; sleep 1; echo 'This is STDERR' 1>&2; sleep 1; echo -n 'Reading STDIN: '; read a";
my $pid=open3('<&STDIN', '>&STDOUT', '>&STDERR', $cmd);
say "Waiting for child..";
wait;
say "Done.";
使用警告;
严格使用;
使用特征qw(例如);
使用IPC::Open3;
my$cmd=“sleep 1;echo This STDOUT;sleep 1;echo'This is STDERR'1>&2;sleep 1;echo-n'Reading STDIN:';read a”;
my$pid=open3('&STDOUT','>&STDERR',$cmd);
说“等孩子……”;
等待
说“完成”;
如果传递字符串'&STDOUT'
,则子进程将获得Perl程序自己的标准输入和输出句柄的副本,并且可以在不进行任何进一步干预的情况下读写它们
这与使用typeglob引用指定文件句柄截然不同。文档中的CHLD_OUT
文件句柄是子进程的STDOUT
,它允许Perl程序从CHLD_OUT
读取数据,以便您可以获取和处理它发送的数据。在这里使用STDOUT
不起作用,因为它是Perl进程的输出文件句柄。如果您真的愿意,可以使用STDIN,但这会使您无法读取最初显示在标准输入中的任何内容
等效点适用于中的CHLD_,这是一个句柄,您可以打印
以将数据发送到子进程。同样,您可以在这里使用STDOUT
,但这剥夺了您原有的标准输出通道。在任何情况下,您仍然必须为CHLD_ERR
发明另一个文件句柄,因为您将从中读取,以查看孩子向其标准错误输出发送的内容,当然,您无法从STDERR
读取
所以你能做的最好的就是替换
open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, 'command')
与
但是文件句柄并不昂贵,所以为什么要放弃标准的输入和输出呢?创建三个新文件句柄并使用所有六个句柄要好得多。感谢您的精彩解释!我想我现在应该明白这个概念:)
open3(\*STDOUT, \*STDIN, \*CHLD_ERR, 'command')