我刚刚碰到一个讨厌的小虫子,因为我打开了一个输入文件而不是输出(这不是令人讨厌的部分)。之所以发生这种情况,是因为我使用的是XML :: Writer,它可以使用受祝福的IO :: Handle引用或文件句柄进行输出(或者标量引用,但这在这里并不重要)。在内部,XML :: Writer在它使用的任何输出上调用->print
。
问题出现了,因为可以在仅为输入打开的文件句柄上调用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 :: classes,所以我只是误解了什么?
为清晰起见编辑:
上面的代码肯定会产生一个警告(第2行)。我觉得第3行也应该发出警告,但事实并非如此。它不会向$out
打印任何内容,也不会警告它不会......它只是无声地失败(这似乎是错误的)。第3行不会对任何版本的Perl产生警告:5.8,5.10或5.16。
答案 0 :(得分:0)
所有版本&gt; = 5.14在第三行(FH方法调用)上正确发出警告。
版本5.10和5.12以不同的方式发出警告:
找不到对象方法&#34; print&#34;通过包&#34; IO ::文件&#34;。
这是因为没有定义打印到仅输入句柄。
您需要print <$out>;
语法来打印输入句柄读取的结果。
版本&lt; 5.10没有说,但会像5.10和5.12一样发出警告。