我试图遍历 Perl 中当前目录的所有子目录,并从这些文件中获取数据。我正在使用 grep 获取给定目录中所有文件和文件夹的列表,但我不知道返回的值中哪个是文件夹名称,哪个是没有文件扩展名的文件。
我怎么能分辨出区别?
您可以使用-d文件测试运算符来检查某物是否是目录。以下是一些常用的文件测试运算符
-e 文件存在。 -z 文件大小为零(为空)。 -s 文件具有非零大小(以字节为单位返回大小)。 -f 文件是一个普通文件。 -d 文件是一个目录。 -l 文件是符号链接。
有关更多信息,请参见perlfunc 手册页
另外,尝试使用File::Find可以为您递归目录。这是一个查找目录的示例....
sub wanted {
if (-d) {
print $File::Find::name." is a directory\n";
}
}
find(\&wanted, $mydir);
print "$file is a directory\n" if ( -d $file );
查看 -X 运算符:
perldoc -f -X
对于目录遍历,请使用 File::Find,或者,如果您不是受虐狂,请使用我的 File::Next 模块,它为您创建了一个迭代器,并且不需要疯狂的回调。事实上,你可以让 File::Next 只返回文件,而忽略目录。
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
我的 $dh = opendir("."); 我的@entries = grep !/^\.\.?$/, readdir($dh); 关闭$dh; foreach 我的 $entry (@entries) { 如果(-f $entry){ # $entry 是一个文件 } elsif (-d $entry) { # $entry 是一个目录 } }
my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
它会更容易使用File::Find
。