2013-03-12 73 views
2

我刚刚遇到了一个令人讨厌的小错误,因为我打开了一个文件用于输入而不是输出(这不是讨厌的部分)。它发生是因为我使用的是XML :: Writer,它可以为输出(或标量ref,或者这里不重要)带来一个祝福的IO :: Handle引用或一个文件句柄来输出。在内部,XML :: Writer在任何正在使用的输出上调用->printPerl IO ::处理警告行为

问题出现了,因为可以在仅为输入打开的文件句柄上调用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。

+0

你有什么版本的Perl和'IO :: Handle'?我用Perl 5.14.2得到警告。 – mob 2013-03-12 15:28:07

+0

我正在运行Perl v5.16.0和IO :: Handle v1.33。上面的代码确实会产生一个警告,但它应该(我认为)产生两个警告; '$ out-> print'应该警告它是否没有打开输出。 – 2013-03-12 15:45:37

+0

我得到了Perl的警告5.10.1 – leonbloy 2013-03-12 15:51:31

回答

0

所有版本> = 5.14都会在第三行FH方法调用中正确发出警告。

版本5.10和5.12做了不同的警告: 无法通过软件包“IO :: File”找到对象方法“print”。 这是因为没有定义打印到仅用于输入的句柄。 您需要使用print <$out>;语法来打印输入句柄读取的结果。

版本< 5.10没有发言权,但会警告与5.10和5.12相同。