虽然我在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变量值吗?
没有看到您的错误消息,我非常清楚错误.
foreach my $dir (@listofdirs) {
open (my $OUTFILE, '>', "$dir/$dir.txt") or die;
...
}
Run Code Online (Sandbox Code Playgroud)
我要去猜测@listofdirs包含的东西像/foo/bar或foo/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)