常に完全修飾ファイル名を使用するchdir $today
よりも、ファイルを開く前に使用することをお勧めします。これにより、現在の作業ディレクトリが変更され、相対パスを使用して指定されたファイルまたはパスがまったく指定されていないファイルが、新しいディレクトリに対して相対的に開かれます。
さらに、autodie
プラグマを使用するとopen
、close
などのステータスをチェックする必要がなくなります。また、レキシカル ファイル ハンドルを使用することは、ファイル ハンドル変数がスコープ外になったときにファイルを暗黙的に閉じるなど、さまざまな理由で望ましいものです。
これは、コードがどのように見えるかです。
use strict;
use warnings;
use autodie;
my $today = 'today';
my $savepage = 'savepage';
my $data = 'data';
mkdir $today unless -d $today;
{
chdir $today;
open my $fh, '>>', $savepage;
print $fh $data;
}
ただし、プログラムが複数のディレクトリ内のファイルを処理する場合、chdir
それらの間を前後に移動するのは面倒であり、元のディレクトリを明示的に保存する必要があります。そうしないと、忘れてしまいます。この場合、File::chdir
モジュールが役立つ場合があります。$CWD
値が変更された場合に現在の作業ディレクトリを変更するパッケージ変数を提供します。ローカライズ ブロックの最後に元の値が復元されるように、他のパッケージ変数と同様にローカライズすることもできます。
ここに例があります。
use strict;
use warnings;
use File::chdir;
use autodie;
my $today = 'today';
my $savepage = 'savepage';
my $data = 'data';
mkdir $today unless -d $today;
{
local $CWD = $today; # Change working directory to $today
open my $fh, '>>', $savepage;
print $fh $data;
}
# Working directory restored to its previous value