Как отличить файл от каталога в Perl?
Я пытаюсь пройти через все подкаталоги текущего каталога в Perl и получать данные из этих файлов. Я использую grep для получения списка всех файлов и папок в данном каталоге, но я не знаю, какое из возвращаемых значений будет именем папки и которое является файлом без расширения файла.
Как я могу сказать разницу?
Ответы
Ответ 1
Вы можете использовать оператор проверки файлов -d, чтобы проверить, что-то является каталогом. Здесь некоторые из наиболее часто используемых операторов проверки файлов
-e File exists.
-z File has zero size (is empty).
-s File has nonzero size (returns size in bytes).
-f File is a plain file.
-d File is a directory.
-l File is a symbolic link.
Подробнее см. справочную страницу perlfunc
Кроме того, попробуйте использовать File:: Find, который может перезаписать каталоги для вас. Здесь образец, который ищет каталоги....
sub wanted {
if (-d) {
print $File::Find::name." is a directory\n";
}
}
find(\&wanted, $mydir);
Ответ 2
print "$file is a directory\n" if ( -d $file );
Ответ 3
Посмотрите на операторы -X:
perldoc -f -X
Для обхода каталога используйте File:: Find или, если вы не мазохист, используйте мой модуль File:: Next, который делает итератор для вас и не требует безумных обратных вызовов. Фактически, вы можете иметь файлы:: Next ONLY возвращать файлы и игнорировать каталоги.
use File::Next;
my $iterator = File::Next::files( '/tmp' );
while ( defined ( my $file = $iterator->() ) ) {
print $file, "\n";
}
# Prints...
/tmp/foo.txt
/tmp/bar.pl
/tmp/baz/1
/tmp/baz/2.txt
/tmp/baz/wango/tango/purple.txt
Он находится в http://metacpan.org/pod/File::Next
Ответ 4
my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
Ответ 5
my $dh = opendir(".");
my @entries = grep !/^\.\.?$/, readdir($dh);
closedir $dh;
foreach my $entry (@entries) {
if(-f $entry) {
# $entry is a file
} elsif (-d $entry) {
# $entry is a directory
}
}
Ответ 6
Было бы проще использовать File::Find
.