私の理解では、オブジェクトのハンドルを閉じるには、組み込みの ( ) ではなく、IO::Pipeメソッド ( ) を使用する必要があります。$fh->closeclose($fh)
先日、IO::Pipe失敗すると予想されるコマンドに対して開かれたオブジェクトに対して、習慣からビルトインを使用しました。が 0 のときに驚いた$?のですが、エラー チェックがトリガーされませんでした。
私は自分の間違いに気づきました。組み込みを使用すると、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:
組み込みの結果がパイプの閉鎖になるのは奇妙に思えますが、設定されません$?。誰かが不一致を説明するのを助けることができますか?
ありがとう!