Мне нужно выполнить мой скрипт (поиск) по всем файлам каталога. Вот методы, которые работают. Я просто спрашиваю, что лучше. (Мне нужны имена файлов формы: parsedchpt31_4.txt)
Глоб:
my $parse_corpus; #(for all options)
##glob (only if all files in same directory as script?):
my @files = glob("parsed"."*.txt");
foreach my $file (@files) {
open($parse_corpus, '<', "$file") or die $!;
... all my code...
}
Readdir с условиями и временем:
##readdir:
my $dir = '.';
opendir(DIR, $dir) or die $!;
while (my $file = readdir(DIR)) {
next unless (-f "$dir/$file"); ##Ensure it's a file
next unless ($file =~ m/^parsed.*\.txt/); ##Ensure it's a parsed file
open($parse_corpus, '<', "$file") or die "Couldn't open directory $!";
... all my code...
}
Readdir с foreach и grep:
##readdir+grep:
my $dir = '.';
opendir(DIR, $dir) or die $!;
foreach my $file (grep {/^parsed.*\.txt/} readdir (DIR)) {
next unless (-f "$dir/$file"); ##Ensure it's a file
open($parse_corpus, '<', "$file") or die "Couldn't open directory $!";
... all my code...
}
File :: Find:
##File::Find
my $dir = "."; ##current directory: could be (include quotes): '/Users/jon/Desktop/...'
my @files;
find(\&open_file, $dir); ##built in function
sub open_file {
push @files, $File::Find::name if(/^parsed.*\.txt/);
}
foreach my $file (@files) {
open($parse_corpus, '<', "$file") or die $!;
...all my code...
}
Есть ли другой способ? Хорошо ли заключать весь цикл в циклы? Это нормально, я не пользуюсь closedir? Я передаю это другим, я не уверен, где будут находиться их файлы (возможно, не сможет использовать glob)
Большое спасибо, надеюсь, это правильное место, чтобы спросить это.