2015-01-12 2 views
0

Я являюсь относительно нечастым пользователем Perl. Я написал сценарий, который принимает два входных файла с тем же именем, но с разными расширениями, обрабатывает их и выводит третий файл. Он работает, когда я указываю имя файла, но я хочу, чтобы он искал все соответствующие файлы в каталоге и обрабатывал все из них. Однако, когда я это делаю, он продолжает говорить, что нет такого файла или каталога - хотя я уверен, что есть. Я просмотрел все соответствующие страницы на этом сайте и пробовал там предложения, но он все равно не работает. Я в тупике.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

Вы действительно точно знаете, что существует? Выполняется ли тест '-e'? – tadman

+0

Было бы лучше проверить, было ли ваше жестко запрограммированное имя файла 'BE_Read01_f2-1-CV.TextGrid'. Посмотрите, работает ли это с вашим циклом while. Кстати, вы добавляете второй '-CV' к имени вашего файла, когда вы определяете' $ gridfile'. Ваша подстановка удаляет '.TextGrid' с конца, и вы возвращаете' -CV.TextGrid'. – Borodin

ответ

0

Из сообщения об ошибке, то очевидно, что линия вызывает ошибку эта линия:

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

он продолжает говорить, что нет такого файла или каталога - хотя я уверен, что есть ,

Вы можете доказать себе, что такой файл не существует, копируя путь в сообщении об ошибке:

Невозможно открыть '/Users/sashacalhoun/Документы/контроль/Тарик/слогов /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 

} 

И ваша отладка оператор печати должен быть таким:

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

open(my $syl, "<", "$path.par"); 

Кстати, если вам не нравится набирать \ п после каждого оператора печати, вы можете использовать сказать():

say "After printing this text, perl automatically adds a '\n' to the end of the output"; 

Вы должны использовать использовать заявление для Say(), чтобы работать, например,

use 5.010; 

И, вы должны добавить штамп() пункт к вашему opendir()/разомкнут() заявления:

opendir (мой $ DIR, $ реж) или умереть «Не удалось открыть $ dir: $! ";

+1

Ему не нужно добавлять утверждения 'die', он использует' autodie'. – TLP

+0

@TLP, Whoops .... – 7stud

+0

Привет - Большое спасибо за ваш быстрый ответ. Я понял, прочитав ваши предложения о том, что у меня была «-CV» часть расширения файла в неправильном месте ... он работает сейчас! Благодарим также за другие предложения о том, как запустить его, не указав каталог. – Sasha

Смежные вопросы