0

基本的に、今日の日付で新しいディレクトリを作成してから、新しいファイルを作成してそのフォルダに保存しようとしています。

すべてのステップを個別に機能させることはできますが、ファイルをディレクトリ内に保存したくありません。基本的に私は以下を扱っています:

mkdir($today);
opendir(DIR, $today) or die "Error in opening dir $today\n";

    open SAVEPAGE, ">>", $savepage
    or die "Unable to open $savepage for output - $!";
    print SAVEPAGE $data;
    close(SAVEPAGE);

closedir(DIR);

適切な例を見つけるために多くの検索を行いましたが、残念ながら、試したクエリのすべての単語で、「開く/保存/ファイル/ディレクトリ」などの数百万のヒットが発生しました。エラーなどをより適切に処理できることに気付きました。機能が動作するようになったら、それが次のステップになります。どんなポインタでもありがたいです、乾杯。

4

2 に答える 2

5

開くファイルの前にディレクトリ名を付けるだけです。opendirは必要ありません

mkdir($today);
open SAVEPAGE, ">>", "$today/$savepage";
于 2013-01-04T16:32:11.773 に答える
0

常に完全修飾ファイル名を使用するchdir $todayよりも、ファイルを開く前に使用することをお勧めします。これにより、現在の作業ディレクトリが変更され、相対パスを使用して指定されたファイルまたはパスがまったく指定されていないファイルが、新しいディレクトリに対して相対的に開かれます。

さらに、autodieプラグマを使用するとopencloseなどのステータスをチェックする必要がなくなります。また、レキシカル ファイル ハンドルを使用することは、ファイル ハンドル変数がスコープ外になったときにファイルを暗黙的に閉じるなど、さまざまな理由で望ましいものです。

これは、コードがどのように見えるかです。

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
于 2013-01-05T15:59:43.143 に答える