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您可能更愿意在打开文件之前使用,而不是一直使用完全限定的文件名。这将更改当前工作目录并强制使用相对路径或根本没有路径指定的文件相对于新目录打开。

此外,使用autodiepragma 将避免需要检查等的状态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 回答