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

Ank*_*nkP 1 perl filehandle

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

我正在使用打开文件

foreach my $dir (@listofdirs) {

open (my $OUTFILE, '>', "$dir/$dir.txt") or die "$!"; 
Run Code Online (Sandbox Code Playgroud)

,这不会创建一个文件,并给我一个错误没有这样的文件或目录.

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

如何控制/指定路径以便在每个$ dir变量(目录)中打开一个文件?如果早些时候已经解决了这个问题,我很抱歉,但我不确定指定新文件路径的正确方法是什么.

编辑 -

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

Sch*_*ern 6

没有看到您的错误消息,我非常清楚错误.

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

我要去猜测@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
Run Code Online (Sandbox Code Playgroud)

其中大多数因各种原因无法运作. /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': $!";
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,您将看到它试图打开的内容,以及它失败的原因(包含在内$!).这很快就会变得令人厌烦和不一致,所以最好让它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");
    ...
}
Run Code Online (Sandbox Code Playgroud)