Perl可以';找不到文件

Perl可以';找不到文件,perl,Perl,我使用Perl的频率相对较低。我编写了一个脚本,它接收两个同名但扩展名不同的输入文件,处理它们并输出第三个文件。当我指定文件名时,它可以工作,但我希望它搜索目录中的所有相关文件并处理所有文件。然而,当我这样做的时候,它总是说没有这样的文件或目录——尽管我确信有。我查看了这个网站上所有相关的页面,并尝试了那里的建议,但仍然不起作用。我被难住了 下面是代码,缺少文件本身的处理,因为这很长,而且不相关 use strict; use warnings; use autodie; #specify s

我使用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);
    }
}
使用严格;
使用警告;
使用自动模具;
#指定单个文件-在未对此进行注释且下面的循环为
#my$file=“BE_Read01_f2-2”;
#在Mac上
my$dir=“/Users/sashacalhoun/Documents/supervision/tariq/音节”;
opendir(my$dh,$dir);
while(my$file=readdir($dh)){
如果($file=~s/(.+-CV)\.TextGrid/$1/){
打印“$file\n”;

打开(my$syl,“从您的错误消息中,很明显导致错误的行是这一行:

open(my $syl, "<", "$dir/${file}.par");

,而不是自己构建路径,应该考虑使用文件::规格等:

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

}
并且,调试打印语句应如下所示:

my $path = "$dir/$file.par";
print "$path\n";

open(my $syl, "<", "$path.par");
say()必须使用use语句才能工作,例如

use 5.010;
并且,您应该在opendir()/open()语句中添加一个die()子句:

opendir(我的$DIR,$DIR)
“或死亡”无法打开$dir:$!"

你绝对确定它存在吗?
-e测试有效吗?如果你的硬编码文件名是
be\u Read01\u f2-1-CV.TextGrid
,那将是一个更好的测试。看看在删除
循环时,这是否对你的
有效。顺便说一句,当你定义
$gridfile
时,你在文件名中添加了第二个
-CV
你的替换将
.TextGrid
从末尾移除,你将
-CV.TextGrid
放回原处。他不需要添加
die
语句,他使用的是
autodie
。嗨-非常感谢你的快速响应。在阅读你的建议后,我意识到我有了“-CV”文件扩展名的一部分放错了位置…它现在可以工作了!还感谢您提供关于如何在不指定目录的情况下运行它的其他建议。
say "After printing this text, perl automatically adds a '\n' to the end of the output";
use 5.010;