我剛剛遇到了一個令人討厭的小錯誤,因爲我打開了一個文件用於輸入而不是輸出(這不是討厭的部分)。它發生是因爲我使用的是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