まずは、まず「オープン」を誤って使用しています。
open my $fp , '>', 'xyz' ;
は推奨構文です。
あなたが持っている裸のFPは、レキシカルではないので、強くお勧めします。
第2に、新しいものとしてファイルポインタを再オープンしています。これはあまり良い習慣ではありません、それは問題ではありませんが、それは単なる悪い考えです。ファイルポインタを閉じるか、(lexicalを介して)スコープを使い果たすようにしてください。
第3に、 '* STDOUT'は参照です。あなたがこれを行うとき
my $fh = *STDOUT;
print "$fh\n"; #prints '*main::STDOUT';
ので:あなたは
open *STDOUT, '>abc';
をやっている
open $fh, '>abc';
、あなたは直後
print "$fh\n";
をすれば、あなたはまだプリントを、それを注意します*main::STDOUT
;これを片付ける
いくつかの興味深いコードスニペット:
my $fh = *STDOUT;
open $fh, '<', "foo.txt";
print $fh "hello";
# Filehandle STDOUT opened only for input at (eval 288) line 6.
my $fh = *STDIN;
open $fh, '<', "foo.txt";
print <>;
# contents of foo.txt here
ここで開い使用することをお勧めの方法があります:あなたが近くに省略した場合、ファイルはできるだけ早く閉鎖されること
sub foo {
my $fh;
open $fh , '<', 'file.txt' or Carp::croak('Cannot Open File.txt');
# do stuff with $fh;
close $fh or Carp::carp('Something annoying in close :S ');
}
注意$ fhは可視性から外れます。
まず、最初の2つのprintf()がprint()でないのはなぜですか?あなたのプログラムで何らかの理由で問題があるのですか、それとも普通のprint()ですか? –
これは単なるコード例ですが、open()(およびclose()!)呼び出しの戻り値を常にチェックすることを忘れないでください。彼らが成功すると仮定しないでください。 –
'$ file = undef;'、 'open $ファイルの前に、"> abc ";'が働いていました。 –