Windows 平台上,Perl文件测试的问题
环境:Windows平台上,ActivePerl 5.10
下面是我写的程序,目的是搜索指定目录下面,所有符合扩展名为.java文件。并将搜索过到的目录和符合要求的文件都写入一个文件中。
#查找一个目录下面所有的文件及子目录下的文件,从文件中找出指定
#模式的字符窜,并将结果记录到一个文件中去
$root_dir = 'D:\StarTeamWork\xxt\jxxxt'; #查找开始的根目录
$file_ext_pattern = '.*\.java'; #只处理指定扩展名的文件,也是正则模式
$dir_pattern = '.*(\.).*'; #因为无法使用文件测试功能,我就用正则表达式代替了
$result_file = 'd:\perl_out.txt'; #结果将被输出到这个文件中
opendir D_ROOT, $root_dir
or die 'Cannot open the root dir, please check the path or dir first! ERROR: $!';
open RESULT,">$result_file";
#对目录中的内容进行迭代
foreach my $file (readdir D_ROOT){
#如果不包含点,那么这个文件就是目录,然后对这个目录应用目录搜索
&search_dir($root_dir,$file) unless $file =~ /$dir_pattern/; #.*(\.).*
#next ;
#如果文件符合指定的模式,就应用文件搜索
&search_file($file) if $file =~ /$file_ext_pattern/;
}
closedir D_ROOT;
sub search_dir{
my ($root,$dir) = @_;
$dir = "$root\\$dir" ;
print RESULT '+'."$dir\n";
#chdir $dir;
opendir D_DIR, $dir or warn "Cannot open the dir during the iterator! $! \nThe dir is : $dir";
foreach my $file (readdir D_DIR){
&search_dir($dir,$file) unless $file =~ /$dir_pattern/;
&search_file($file) if $file =~ /$file_ext_pattern/;
}
closedir D_DIR;
}
sub search_file{
my $file = shift @_;
print RESULT "\t"."$file\n";
}
------------------------------------------------------------------
我在程序里面,对目录的判断用的是正则表达式,原理是:只要某个文件不包含“.”,就认定它是目录。这个还存在一定的问题。比如,对于一个Entry文件,会被认作是目录。
但是如果我用文件测度的话,如:
&search_dir ($root, $file ) if -d $file; #如果是目录,就应用目录搜索
那么结果就相当的惨烈了。它只能搜索到一个叫做 '.'的当前目录,和一个'..'父目录,其余的目录它根本就是测不出来?这是为什么?而且文本文件测试 -f 也不管用。