例如:
#!/usr/bin/perl
my @arr = ('/usr/test/test.*.con');
my $result = FileExists(\@arr);
print $result ;
sub FileExists {
my $param = shift;
foreach my $file (@{$param}) {
print $file ;
if (-e $file) {
return 1;
}
}
return 0;
}
它返回0.但我想找到所有狂野的角色......如何解决这个问题?
答案 0 :(得分:10)
-e
无法处理文件全局。改变这一行
my @arr = ('/usr/test/test.*.con');
到
my @arr = glob('/usr/test/test.*.con');
首先展开glob模式,然后检查匹配的文件是否存在。但是,由于glob只返回与模式匹配的现有文件,因此所有文件都会存在。
答案 1 :(得分:2)
您需要使用glob()来获取文件列表。
另外,我不确定为什么你将数组作为引用传递,当默认情况下subs取一个数组。您可以更轻松地编写它:
my @arr = (...);
my $result = FileExists(@arr);
sub FileExists {
foreach my $file (@_) {
...
}
return 0;
}
答案 2 :(得分:2)
如果要处理glob模式,请使用glob
运算符展开它们。然后测试所有路径,将结果存储在哈希中,并返回哈希值。
sub FileExists {
my @param = map glob($_) => @{ shift @_ };
my %exists;
foreach my $file (@param) {
print $file, "\n";
$exists{$file} = -e $file;
}
wantarray ? %exists : \%exists;
}
然后说你在
中使用它use Data::Dumper;
my @arr = ('/tmp/test/test.*.con', '/usr/bin/a.txt');
my $result = FileExists(\@arr);
$Data::Dumper::Indent = $Data::Dumper::Terse = 1;
print Dumper $result;
示例运行:
$ ls /tmp/test test.1.con test.2.con test.3.con $ ./prog.pl /tmp/test/test.1.con /tmp/test/test.2.con /tmp/test/test.3.con /usr/bin/a.txt { '/tmp/test/test.3.con' => 1, '/tmp/test/test.1.con' => 1, '/usr/bin/a.txt' => undef, '/tmp/test/test.2.con' => 1 }
答案 3 :(得分:0)
使用glob()可以进行shell扩展,并且可以检索使用shell通配符的文件,正如其他人指出的那样。
如果你发现它有用,'all_files_exist'的一些更简洁的功能可能是
sub all_files_exist {
# returns 1 if all files exist and 0 if the number of missing files (!-e)
# captured with grep is > 0.
# This method expect an array_ref as first and only argument
my $files=shift;
return (grep {!-e $_} @$files)>0? 0 : 1;
}
sub non_existing_files {
# or you can capture which ones fail, and print with
# print join("\n", @(non_existing_files($files)))
my $files = shift;
return [grep {!-e $_} @$files]
}