Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中创建新文件并保存到open directory_Perl_Directory - Fatal编程技术网

在Perl中创建新文件并保存到open directory

在Perl中创建新文件并保存到open directory,perl,directory,Perl,Directory,基本上,我正在尝试创建一个包含今天日期的新目录,然后创建一个新文件并将其保存在该文件夹中 我可以让所有步骤单独工作,但是文件不希望保存在目录中。基本上,我的工作是: mkdir($today); opendir(DIR, $today) or die "Error in opening dir $today\n"; open SAVEPAGE, ">>", $savepage or die "Unable to open $savepage for output -

基本上,我正在尝试创建一个包含今天日期的新目录,然后创建一个新文件并将其保存在该文件夹中

我可以让所有步骤单独工作,但是文件不希望保存在目录中。基本上,我的工作是:

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);

我做了很多搜索,试图找到一个合适的例子,但不幸的是,我尝试过的查询中的每一个单词都有数百万次点击“打开/保存/文件/目录”等。我意识到我可以更好地处理错误等,这将是下一步,一旦我的功能正常工作。谢谢您的指点,干杯。

只需在要打开的文件前面加上目录名即可。不需要opendir

mkdir($today);
open SAVEPAGE, ">>", "$today/$savepage";

只需在要打开的文件前面加上目录名。不需要opendir

mkdir($today);
open SAVEPAGE, ">>", "$today/$savepage";

与其一直使用完全限定的文件名,您可能更愿意在打开文件之前使用
chdir$today
。这将更改当前工作目录,并强制相对于新目录打开使用相对路径或根本没有路径指定的文件

此外,使用pragma将避免检查
打开
关闭
等状态。;出于许多原因,使用词法文件句柄更可取,包括当filehandle变量超出范围时隐式关闭文件

这就是代码的外观

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
是很困难的,并且必须显式地保存原始目录,否则它将被遗忘。在这种情况下,模块可能会有所帮助。它提供了
$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

与其一直使用完全限定的文件名,您可能更愿意在打开文件之前使用
chdir$today
。这将更改当前工作目录,并强制相对于新目录打开使用相对路径或根本没有路径指定的文件

此外,使用pragma将避免检查
打开
关闭
等状态。;出于许多原因,使用词法文件句柄更可取,包括当filehandle变量超出范围时隐式关闭文件

这就是代码的外观

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
是很困难的,并且必须显式地保存原始目录,否则它将被遗忘。在这种情况下,模块可能会有所帮助。它提供了
$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

您将
opendir
chdir
混淆。前者“打开”目录,即读取其包含的文件名。后者会更改您的工作目录,如*nix和windows中命令提示符下的命令
cd
。您将
opendir
chdir
混淆。前者“打开”目录,即读取其包含的文件名。后者会更改您的工作目录,如*nix和windows中命令提示符下的命令
cd
。@ChrisKeep检查答案是否已被接受以帮助其他人:)。谢谢-完成。昨天发现答案太快,无法同时将其标记为已接受:)@ChrisKeep检查答案是否已接受以帮助其他人:)。谢谢-完成。昨天发现答案太快,无法同时将其标记为已接受:)非常感谢您提供的详细答案,我将在进一步开发脚本时记住它。非常感谢您提供的详细答案,我将在进一步开发脚本时记住它。