美元兑换?在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
仍在尝试写入的管道。