2013-03-12 56 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相同。