在Perl中判断文件存在时总是返回false

时间:2015-12-07 10:23:03

标签: perl io

以下示例适用于我

if(-e "/tmp/test.txt"){  
  print "the file exists\n";

}else{
  print "no file \n";
}

但如果我进行更改以动态获取文件,则无法正常运行并始终重新运行false

@files=();
$target="*";
$subdir="Y";
$dir="/tmp/";

find ( \&file_wanted, $dir);

foreach $file (@files ){

    if(-e $file){  
      print "the file exists\n";

    }else{
      print "no file \n";
    }
}

下面附带的file_wanted函数

sub file_wanted {

    ##########################################################
    #  $_ contains the current filename within the directory
    #  $File::Find::dir contains the current directory name
    #  $File::Find::name contains $File::Find::dir/$_
    #####################################################

    # use regular expression

    #if ( ( $target ne '*' ) &&  !( $_ =~ /$target/ )) { 
    #   return;     
    #}
    if( $target eq '*'){
       if ( $subdir eq 'Y' ) {  
        #recursive subdirectory search
        push @files, "$File::Find::name\n"  if -f; 
       } else  {            
        push @files, "$File::Find::name\n"  if -f && $File::Find::dir eq $dir ;
       }
    }else{
    if ( $subdir eq 'Y' ) {  
    #recursive subdirectory search
        push @files, "$File::Find::name\n"  if -f && $_  =~ /$target/; 
       } else  {            
        push @files, "$File::Find::name\n"  if -f && $File::Find::dir eq $dir && $_  =~ /$target/ ;
       }
   }
}

任何人都可以建议如何发生这种情况并提前感谢

1 个答案:

答案 0 :(得分:3)

您将@files的元素视为路径,但它们并非如此。 @files的元素是与换行符连接的路径。

更改

push @files, "$File::Find::name\n"

push @files, $File::Find::name

顺便说一下,使用-e这种方式并不完全正确。发生错误时,即使该文件存在,也会报告该文件不存在。如果您想处理错误,可以使用以下内容:

if (-e $qfn) {
   # File exists
   ...
}
elsif ($!{ENOENT}) {
   # File doesn't exist
   ...
}
else {
   # Could not determine if the file exists or not. Error in $!
   ...
}