ファイル作成

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あるとも限らないしね。