2

我刚刚在做某事时遇到了一个讨厌的小错误,因为我打开了一个输入文件而不是输出文件(这不是讨厌的部分)。发生这种情况是因为我使用的是 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。

4

1 回答 1

0

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

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

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

于 2015-07-10T10:05:02.563 回答