Perl IO ::处理警告行为

时间:2013-03-12 15:23:33

标签: perl

我刚刚碰到一个讨厌的小虫子,因为我打开了一个输入文件而不是输出(这不是令人讨厌的部分)。之所以发生这种情况,是因为我使用的是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。

1 个答案:

答案 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一样发出警告。