Windows は、ファイル記述子をネイティブに使用します。MSDNの低レベル I/O を参照してください。それらはすべて C 変数を介してエラーを報告しますerrno
。つまり、Perl の に表示され$!
ます。
入力の手間を少し省けることに注意してください。
open(STDOUT, ">&=", $saveout) or ...;
in perlfuncのドキュメントがopen
以下を提供しているため、これは機能します。
3 引数形式を使用する場合は、数値、ファイルハンドルの名前、または通常の「グロブへの参照」のいずれかを渡すことができます。</p>
最後に、を呼び出すときは常にdie
意味のある診断を含めてください。以下のプログラムは、自身を識別し ( $0
)、何をしようとしていたか ( open
)、なぜ失敗したか ( $!
) を示します。また、メッセージは改行で終わらないため、die
ファイルの名前とそれが呼び出された行番号を追加します。
my $fakefd = 12345;
open(STDOUT, ">&=", $fakefd) or die("$0: open: $!");
これにより、
prog.pl: open: foo.pl 行 2 のファイル記述子が正しくありません。
(because you used and not ) のドキュメントに_fdopen
よると、2 つの障害モードがあります。>&=
>&
実行の続行が許可されている場合、errno
は に設定されEBADF
、不正なファイル記述子をEINVAL
示すか、モードが NULL ポインターであったことを示す に設定されます。
perlio.c
2 番目は perl のバグであり、計算モードを含む場所が見当たらないため、非常にありそうにありません。それらはすべて静的な文字列です。
で問題が発生したよう$saveout
です。復元$saveout
する前に閉じられた可能性がありますか? あなたの例から、strict
プラグマを有効にしたかどうかは不明です。レキシカルでない ( で宣言されているmy
) 場合、 でサルをする関数を呼び出しています$saveout
か?