我刚刚在做某事时遇到了一个讨厌的小错误,因为我打开了一个输入文件而不是输出文件(这不是讨厌的部分)。发生这种情况是因为我使用的是 XML::Writer,它可以采用有福的 IO::Handle 引用或文件句柄作为输出(或标量引用,但这在这里并不重要)。在内部,XML::Writer 调用->print
它使用的任何输出 ref。
出现问题的原因是可以调用print
仅为输入而打开的文件句柄,而 IO::Handle 根本不会发出警告。这里有一些代码来说明:
open my $out, '<', 'out.txt';
say $out 'testing'; # warns, "Filehandle opened only for input"
$out->print('testing'); # doesn't do anything?!
open my $out2, '>', 'out2.txt';
$out2->print('testing'); # works fine
这里发生了什么?这是预期的行为吗?我不经常使用 IO:: 类,所以我只是误解了一些东西吗?
为清楚起见进行编辑:
上面的代码肯定会产生一个警告(第 2 行)。我觉得第 3 行也应该产生警告,但事实并非如此。它不会向 打印任何内容$out
,也不会警告它不会...它只是默默地失败(这似乎是错误的)。第 3 行不会对我拥有的任何 Perl 版本产生警告:5.8、5.10 或 5.16。