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)
  • 但只有第四个似乎有效。根据手册,我认为3号也应该起作用。例如:

    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')