我的理解是关闭IO::Pipe
对象的句柄应该使用方法($fh->close
)而不是内置的(close($fh)
)。
前几天,我出于习惯在一个对象上犯了错误并使用了内置,该IO::Pipe
对象打开了一个我预计会失败的命令。零时我很惊讶$?
,而且我的错误检查没有被触发。
我意识到我的错误。如果我使用内置,IO:Pipe
则无法执行waitpid()
并且无法设置$?
。但令我惊讶的是 perl 似乎仍然关闭管道而不$?
通过核心设置。
我编写了一个小测试脚本来说明我的意思:
use 5.012;
use warnings;
use IO::Pipe;
say 'init pipes:';
pipes();
my $fh = IO::Pipe->reader(q(false));
say 'post open pipes:';
pipes();
say 'return: ' . $fh->close;
#say 'return: ' . close($fh);
say 'status: ' . $?;
say q();
say 'post close pipes:';
pipes();
sub pipes
{
for my $fd ( glob("/proc/self/fd/*") )
{
say readlink($fd) if -p $fd;
}
say q();
}
使用该方法时,它显示管道在关闭后消失$?
并按我的预期设置:
init pipes:
post open pipes:
pipe:[992006]
return: 1
status: 256
post close pipes:
而且,当使用内置时,它似乎也关闭了管道,但没有设置$?
:
init pipes:
post open pipes:
pipe:[952618]
return: 1
status: 0
post close pipes:
对我来说,内置导致管道关闭,但没有设置,这似乎很奇怪$?
。任何人都可以帮助解释差异吗?
谢谢!