在打开新文件的路径中指定一个数组变量

Specify an array variable in the path for opening a new file

虽然我发现很多关于如何在 perl 中的 for 循环中打开文件的帖子,但我在目录(也是数组变量)中创建文件时遇到了一个具体问题-

我正在使用

打开一个文件
foreach my $dir (@listofdirs) {

open (my $OUTFILE, '>', "$dir/$dir.txt") or die "$!"; 

,这不会创建文件并给我一个错误 No such file or directory。

如果我只使用 open (my $OUTFILE, '>', "$dir.txt") or die; 它可以工作并在我执行脚本的主目录下创建一个文件。

我怎样才能 control/specify 路径以便它在每个 $dir 变量(目录)中打开一个文件? 很抱歉,如果之前已经解决了这个问题,但我不确定指定新文件路径的正确方法是什么。

编辑 -

我可以更改在循环内创建文件的目录并每次为其分配 $dir 变量值吗?

没有看到你的错误信息,我很清楚哪里出了问题。

foreach my $dir (@listofdirs) {
    open (my $OUTFILE, '>', "$dir/$dir.txt") or die; 
    ...
}

我猜 @listofdirs 包含 /foo/barfoo/bar/baz/ 之类的东西,因此 "$dir/$dir.txt" 会创建一些有趣的文件路径。

$dir                      "$dir/$dir.txt"
/foo/bar                  /foo/bar//foo/bar.txt
foo/bar/                  foo/bar//foo/bar/.txt
foo/                      foo//foo/.txt

由于各种原因,其中大部分都无法使用。 /foo/bar//foo/bar.txt 将要求目录 /foo/bar/foo/ 已经存在。 foo/bar//foo/bar/.txt 是无效路径。

"$dir/$dir.txt" 无论如何都是一个有趣的结构。你确定那是你的意思吗?


要找出问题所在,您可以在错误消息中添加一些信息。传统的方法是在每次 open 调用时全部手写。

foreach my $dir (@listofdirs) {
    open (my $OUTFILE, '>', "$dir/$dir.txt")
        or die "Can't open '$dir/$dir.txt': $!";
    ...
}

现在您将看到它试图打开的内容,以及失败的原因(包含在 $!). This rapidly gets tiresome and inconsistent, so it's better to let autodie 为您完成。

# at the top of your code along with things like "use strict"
use autodie;

...

foreach my $dir (@listofdirs) {
    open (my $OUTFILE, '>', "$dir/$dir.txt");
    ...
}