我刚刚遇到了一个令人讨厌的小错误,因为我打开了一个文件用于输入而不是输出(这不是讨厌的部分)。它发生是因为我使用的是XML :: Writer,它可以为输出(或标量ref,或者这里不重要)带来一个祝福的IO :: Handle引用或一个文件句柄来输出。在内部,XML :: Writer在任何正在使用的输出上调用->print
。Perl 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。
你有什么版本的Perl和'IO :: Handle'?我用Perl 5.14.2得到警告。 – mob 2013-03-12 15:28:07
我正在运行Perl v5.16.0和IO :: Handle v1.33。上面的代码确实会产生一个警告,但它应该(我认为)产生两个警告; '$ out-> print'应该警告它是否没有打开输出。 – 2013-03-12 15:45:37
我得到了Perl的警告5.10.1 – leonbloy 2013-03-12 15:51:31