以下示例适用于我
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/ ;
}
}
}
任何人都可以建议如何发生这种情况并提前感谢
答案 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 $!
...
}