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
吗?