Windows 本机使用文件描述符。请参阅MSDN 上的低级 I/O。它们都通过 C 变量报告错误errno,这意味着它们出现在 Perl 的$!.
请注意,您可以节省一些打字时间:
open(STDOUT, ">&=", $saveout) or ...;
这是有效的,因为in perlfunc的文档open提供了:
如果您使用 3-arg 形式,那么您可以传递一个数字、文件句柄的名称或正常的“对 glob 的引用”。</p>
最后,在您致电时始终包含有意义的诊断信息die!下面的程序识别自己 ( $0),告诉它它试图做什么 ( open),以及它失败的原因 ( $!)。此外,由于消息不以换行符结尾,die因此添加了文件名和调用它的行号。
my $fakefd = 12345;
open(STDOUT, ">&=", $fakefd) or die("$0: open: $!");
这产生
prog.pl: open: foo.pl 第 2 行的错误文件描述符。
根据(因为您使用而不是)的文档_fdopen,它有两种故障模式:>&=>&
如果允许继续执行,errno则设置为EBADF,指示错误的文件描述符,或EINVAL,指示该模式为空指针。
第二个是 perl 中的一个错误,而且不太可能,因为我看不到任何perlio.c涉及计算模式的地方:它们都是静态字符串。
似乎出了点问题$saveout。在您尝试恢复之前可能$saveout已关闭?从您的示例中,尚不清楚您是否启用了strict编译指示。如果它不是词法的(用 声明my),你是在调用一个也用 猴子 的函数$saveout吗?