如何在Perl中找到该文件

时间:2010-08-04 13:53:06

标签: perl

例如:

#!/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.但我想找到所有狂野的角色......如何解决这个问题?

4 个答案:

答案 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]
}