ファイル作成
via ファイルを作成する - Perlゼミ(サンプルコードPerl入門)
これ、タイミングの関係でまずいことが起きる気がする。
my $file = "sample_20080519_$$.txt"; # $$ はプロセスID if( -e $file ){ # ← 上書きしてはいけないので、存在をチェック。 croak "$file は、すでに存在します。"; } else{ open( my $fh, ">", $file ) or croak "$file を書き込みモードでオープンすることができません。: $!"; # ↑ open関数を使ったときは、必ず戻り値をチェックします。 # openが失敗すれば、その内容が、 $! に代入されます。 close( $fh ); }
めったに起きないとは思うけど、if (-e $file)
でファイルが存在しないことをチェックしてからelse
の中のopen
が呼ばれるまでの間に、別のプロセスがファイルを作成してしまうと、書き込み用にファイルを開いてしまって、上書きしてしまう。なので、sysopen
使ったほうがいいんじゃないかなぁ。
use Fcntl; # O_WRONLYとかの定数はこのモジュールで定義されてる my $file = "sample_20080519_$$.txt"; sysopen(my $fh, $file, O_WRONLY | O_EXCL | O_CREAT) or croak $!; # O_WRONLY => 書き込み専用 # O_EXCL => ファイルが存在したら失敗 # O_CREAT => ファイルがなかったら新しく作る close $fh;
あるいは、
system 'touch', $file;
なんてのは、まあ、冗談ですが。そもそもWinだったりするとtouchあるとも限らないしね。