基本上,我正在尝试使用今天的日期创建一个新目录,然后创建一个新文件并将其保存在该文件夹中。
我可以让所有步骤单独工作,但是文件不希望保存在目录中。基本上我正在使用:
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);
我已经做了很多搜索,试图找到一个合适的例子,但不幸的是,我尝试的查询中的每一个字都有数百万次点击“open / save / file / directory”等等。我意识到我可以处理错误等等更好,一旦我使功能正常工作,这将是下一步。任何指针都会受到赞赏,欢呼。
答案 0 :(得分:5)
只需使用目录名称打开文件前缀即可。不需要opendir
mkdir($today);
open SAVEPAGE, ">>", "$today/$savepage";
答案 1 :(得分:0)
在打开文件之前,您可能更喜欢使用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