美元兑换?在perl中调用close之后

美元兑换?在perl中调用close之后,perl,pipe,Perl,Pipe,下面是代码 use strict; use warnings; my $cmd = "ls"; my $pid = open(INPUT,"$cmd 2>&1 |"); print "PID = [$pid] [$?]\n"; if (!defined($pid)) { print "PID not defined\n"; } else { print "BEFORE CLOSING exit code is [$?]\n"; }

下面是代码

use strict;  
use warnings;

my $cmd = "ls";  
my $pid = open(INPUT,"$cmd 2>&1 |");  
print "PID = [$pid] [$?]\n";  
if (!defined($pid)) {  
    print "PID not defined\n";  
} else {  
    print "BEFORE CLOSING exit code is [$?]\n";  
}  
close INPUT;  
print "AFTER CLOSING [$?]\n";  
结果如下:

PID = [32300] [0]  
BEFORE CLOSING exit code is [0]  
AFTER CLOSING [13]

为什么美元的价值如此之高?调用close()后的更改?

根据以下文档:

。。。 关闭管道还将等待在管道上执行的进程退出(如果您希望随后查看管道的输出),并隐式地将该命令的退出状态值放入
$?
${^CHILD\u ERROR\u NATIVE}

因此,在您的示例中,
$?
包含命令ls

的退出状态,表示
$?
为:

最后一个管道关闭、backtick(``)命令、成功调用wait()或waitpid()或从system()运算符返回的状态


因此,很明显,它必须反映管道关闭的状态。在任何这些操作之前,其内容都是无意义的。

注意:它实际上是执行
sh
(而不是
ls
),因此它实际上是
sh
$?
中的退出状态。也就是说,
sh
的退出状态在大多数情况下都是
ls
;它只是表示您关闭了
ls
仍在尝试写入的管道。