Как я могу получить список всех файлов с определенным расширением из определенной директории?
Я использую этот код, чтобы получить список всех файлов в определенной директории:
opendir DIR, $dir or die "cannot open dir $dir: $!";
my @files= readdir DIR;
closedir DIR;
как я могу изменить этот код или добавить что-то к нему, чтобы он искал только текстовые файлы и загружал массив только с префиксом имени файла?
пример содержимого каталога:
.
..
923847.txt
98398523.txt
198.txt
deisi.jpg
oisoifs.gif
lksdjl.exe
пример массива содержание:
files[0]=923847
files[1]=98398523
files[2]=198
6 ответов
Если вы можете использовать новые функции Perl 5.10, вот как я бы это написал.
use strict;
use warnings;
use 5.10.1;
use autodie; # don't need to check the output of opendir now
my $dir = ".";
{
opendir my($dirhandle), $dir;
for( readdir $dirhandle ){ # sets $_
when(-d $_ ){ next } # skip directories
when(/^[.]/){ next } # skip dot-files
when(/(.+)[.]txt$/){ say "text file: ", }
default{
say "other file: ", $_;
}
}
# $dirhandle is automatically closed here
}
или если у вас очень большие каталоги, вы могли бы использовать while
петли.
{
opendir my($dirhandle), $dir;
while( my $elem = readdir $dirhandle ){
given( $elem ){ # sets $_
when(-d $_ ){ next } # skip directories
when(/^[.]/){ next } # skip dot-files
when(/(.+)[.]txt$/){ say "text file: ", }
default{
say "other file: ", $_;
}
}
}
}
чтобы получить только ".txt " файлы, вы можете использовать оператор тестирования файла (- f : обычный файл) и регулярное выражение.
my @files = grep { -f && /\.txt$/ } readdir $dir;
в противном случае вы можете искать только текстовые файлы, используя perl'S-T (ascii-text file test operator)
my @files = grep { -T } readdir $dir;
Это самый простой способ, который я нашел (как в читаемом человеком), используя функцию glob:
# Store only TXT-files in the @files array using glob
my @files = grep ( -f ,<*.txt>);
# Write them out
foreach $file (@files) {
print "$file\n";
}
кроме того, "- f" гарантирует, что в массиве хранятся только фактические файлы (а не каталоги).