我的理解是,關閉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:
對於我來說,在管道關閉中的內置結果似乎很奇怪,但沒有設置$?
。任何人都可以解釋這種差異嗎?
謝謝!