2016-09-07 26 views
0

で同じファイルを開いて、私は残念ながら、私はこのスクリプトを実行しているときに私はなっておりませんファイルへの書き込みと入力

open(FH, '>', "temp.out") or die "cannot open"; 
select FH; 

print "Hello World!"; 
close FH; 

open (FI, "temp.out") or die "cannot open"; 
while (<FI>) { 
    print $_; 
} 

以下のようなPerlスクリプトを書いていたの「Hello World!」を印刷されます。これは理想的なケースでしょうか?

temp.outファイルでは、「Hello World!」と表示されます。印刷されます。

ファイル名に変数を使用しようとしましたが、これも機能しませんでした。

+0

なぜ2つの 'select FH;'ステートメントをそこに置いたのですか? – redneb

+0

問題はselectであると思います。それがなければ、それは動作します。 – Sascha

+2

@Sascha:私はあなたが 'select'と呼ばれる2つのPerl関数の間で混乱するかもしれないと思います。これは単一の引数を持つもので、フラグやビットマスクとは関係ありません。 –

答えて

3

print $_は閉じたファイルハンドルに入ります。 FHをデフォルトの出力ファイルハンドルとして選択し、それを閉じたので、それ以上書き込むことはできません。いずれの場合でも、そのファイルハンドルは画面ではありません。たとえそれが開いていても、あなたは画面上でそれを見ることはできません。

STDOUTを保存して再選択する必要があります。

open(FH,'>', "temp.out") or die "cannot open"; 
my $stdout = select FH; 
print "Hello World!"; 
close FH; 
select $stdout; # here 
open (FI, "temp.out") or die "cannot open"; 
while(<FI>){ 
    print $_; 
} 
+0

また、警告を有効にすると、印刷時に 'print()on filehandle'警告が表示されます。 – ysth

+0

それは私が投稿の途中で画面から離れて歩くために得るものです。 – mbethke

5

必ずスクリプトでstrictwarningsを使用し、これはあなたが遭遇したエラーをキャッチしているだろう:

print() on closed filehandle FH at t.pl line 10, <FI> line 1. 

あなたFHまだあなたはそれを閉じていても、結局選択されています。あなたは多くの印刷ステートメントを持っていて、どういうわけかselectを隔離することはできません(例えば、関数の先頭で選択し、最後にデフォルトを復元するなど)。printステートメントで明示的にファイルハンドルを指定することをお勧めします。

+0

はい。私はそれを加えなかった。時間が足りません。クレジットを取る、あなたは正しいです。 :-) – simbabque

+0

NP、まずは最初です! :) – mbethke

関連する問題