我是Perl的一个相对不常用的用户。我编写了一个脚本,它接受两个具有相同名称但不同扩展名的输入文件,处理它们并输出第三个文件。它在我指定文件名时有效,但我希望它能够搜索目录中的所有相关文件并处理所有这些文件。但是,当我这样做时,它一直说没有这样的文件或目录 - 即使我确定有。我查看了本网站上的所有相关页面,并在那里尝试了建议,但它仍然无效。我很难过。
这是代码,缺少文件本身的处理,因为它很长且不相关。
use strict;
use warnings;
use autodie;
#specify single file - works when this is not commented and the loops below are
#my $file = "BE_Read01_f2-2";
#on a Mac
my $dir = "/Users/sashacalhoun/Documents/supervision/tariq/Syllables";
opendir(my $dh, $dir);
while (my $file = readdir($dh)) {
if($file=~s/(.+-CV)\.TextGrid/$1/) {
print "$file\n";
open(my $syl, "<", "$dir/${file}.par");
while(my $line=<$syl>) {
#processes this file - not included
}
close($syl);
my $gridfile = "$file-CV.TextGrid";
my $outfile = "$file-syl.TextGrid";
open(my $grid, "<", $gridfile);
open(my $out, ">", $outfile);
while(my $line=<$grid>) {
print $out $line;
# other processing of this file
}
close($grid);
close($out);
}
}
它说:Can't open '/Users/sashacalhoun/Documents/supervision/tariq/Syllables/BE_Read01_f2-1-CV.par' for reading: 'No such file or directory' at ./get_syl.pl line 36
非常感谢你的帮助。
答案 0 :(得分:0)
从错误消息中可以看出,导致错误的行就是这一行:
open(my $syl, "<", "$dir/${file}.par");
它一直说没有这样的文件或目录 - 即使我确定有。
您可以通过复制错误消息中的路径来证明自己没有此类文件:
无法打开 '的 /Users/sashacalhoun/Documents/supervision/tariq/Syllables/BE_Read01_f2-1-CV.par 强>' 阅读:'没有这样的文件或目录'在./get_syl.pl第36行
并且这样做:
$ ls /Users/sashacalhoun/Documents/supervision/tariq/Syllables/BE_Read01_f2-1-CV.par
而且,不应自己构建路径,而应考虑使用File :: Spec等:
use File::Spec::Functions;
my $path = catfile $dirname, $fname;
并且,在构建路径之前,您应该检查文件名是文件还是目录:
if (-f $path -r $path) { #then it's a file that is readable...
#Here you might want to skip files whose names start with a '.', i.e. hidden files
}
并且,您的调试print语句应为:
my $path = "$dir/$file.par";
print "$path\n";
open(my $syl, "<", "$path.par");
顺便说一下,如果你不喜欢在每个print语句后输入\ n,你可以使用say():
say "After printing this text, perl automatically adds a '\n' to the end of the output";
你必须使用say()的use语句来工作,例如
use 5.010;
并且,你应该在你的opendir()/ open()语句中添加一个die()子句:
opendir(我的$ DIR,$ dir)
或死“无法打开$ dir:$!”;