Как найти файл существует в Perl - PullRequest
1 голос
/ 04 августа 2010

Например:

#!/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 ]

10 голосов
/ 04 августа 2010

-e не может обрабатывать файловые глобусы.Измените эту строку

my @arr = ('/usr/test/test.*.con');

на

my @arr = glob('/usr/test/test.*.con');

Чтобы сначала развернуть шаблон глобуса, а затем проверить наличие соответствующих файлов.Однако, поскольку glob будет возвращать только существующие файлы, соответствующие шаблону, все файлы будут существовать в любом случае.

2 голосов
/ 04 августа 2010

Если вы хотите работать с шаблонами глобуса, используйте оператор 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
}
2 голосов
/ 04 августа 2010

Вам нужно использовать glob (), чтобы получить список файлов.

Кроме того, я не уверен, почему вы передаете массив как ссылку, когда подпрограммы принимают массив по умолчанию. Вы могли бы намного проще написать это так:

my @arr = (...);
my $result = FileExists(@arr);

sub FileExists {
    foreach my $file (@_) {
        ...
    }
    return 0;
}
0 голосов
/ 28 ноября 2011

Используя glob (), вы получите расширение оболочки, и файлы, использующие подстановочные знаки оболочки, могут быть извлечены, как указали другие.

И на всякий случай, если вы сочтете это полезным, более краткая функция для '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]
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...