1

以下是代码

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() 后发生变化?

4

2 回答 2

2

根据perl close的文档:

...关闭管道还等待在管道上执行的进程退出 - 如果您希望之后查看管道的输出 - 并隐式将该命令的退出状态值放入$?and ${^CHILD_ERROR_NATIVE}。...

所以在你的例子中,$?包含命令 ls 的退出状态

于 2013-04-06T15:18:43.177 回答
1

perlvar$?是:

最后一个管道关闭、反引号 (`` ) 命令、成功调用 wait() 或 waitpid() 或来自 system() 运算符返回的状态。

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

于 2013-04-06T15:33:46.430 回答