出力ではなく入力用にファイルを開いたため、実行していたことで厄介な小さなバグに遭遇しました(それは厄介な部分ではありません)。これは、XML::Writer を使用していたために発生しました。これは、祝福された IO::Handle 参照または出力用のファイルハンドル (またはスカラー参照ですが、ここでは重要ではありません) のいずれかを取ることができます。内部的には、XML::Writer は->print
、それが使用しているどのような出力参照でも呼び出します。
入力のためだけに開かれたファイルハンドルを呼び出すことができ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:: クラスをあまり使用しないので、何か誤解しているだけですか?
わかりやすくするために編集します。
上記のコードは、間違いなく 1 つの警告 (2 行目) を生成します。3 行目も警告を生成する必要があるように感じますが、そうではありません。に何も出力せず$out
、出力しないことを警告しません...単に黙って失敗します(これは間違っているようです)。行 3 は、私が持っている Perl のどのバージョンでも警告を生成しません: 5.8、5.10、または 5.16。