Как определить файл в Perl - PullRequest
1 голос
/ 16 июня 2010

Я использую File :: Find -> find (\ & f, $ directory) для поиска файла с некоторым содержимым. Соответствующая часть моего делегата выглядит так:

sub f {
  my $file = $File::Find::name;
  return unless -f $file;
  return unless $file =~ /$file_pattern/;

  etc...

но проблема в том, что этот код возвращается каждый раз, когда $ file не существует в текущем каталоге. Например, для файла ./test это нормально, но для файла ./dir/test это возвращение ...

Есть ли лучший способ узнать, является ли $ file файлом?

Ответы [ 3 ]

7 голосов
/ 16 июня 2010

Эта строка

return unless -f $file;

вернется, если $ file не является файлом (это может быть папка)

Эта строка

return unless $file =~ /$file_pattern/;

вернется, еслифайл name не содержит $ file_pattern.

Обратите внимание, что этот sub f () НЕ сообщает File :: Find, какие файлы искать, согласно документации ...

Функция wanted () выполняет любые проверки для каждого файла и каталога.Обратите внимание, что, несмотря на свое имя, функция wanted () является общей функцией обратного вызова и не сообщает File :: Find, является ли файл «требуемым» или нет.Фактически, его возвращаемое значение игнорируется.

Чтобы найти все файлы в папке, вам может быть проще использовать File :: Find :: Rule .Вот пример из документов ...

  my @files = File::Find::Rule->file()
                              ->name( '*.pm' )
                              ->in( @INC );
0 голосов
/ 18 июня 2010

Спасибо всем за повторы, но вы не правы :) Вот какая-то ошибка.Работает только с полным путем.Я выполняю некоторые тесты.Вот код:

#!/usr/bin/perl

use strict;
use File::Find;
use Cwd;

print "++ With relative path ++\n";
find(\&f, ".");

print "\n++ With current working directory module ++\n";
find(\&f, cwd);

sub f
{
        my $file = $File::Find::name;
        print $file . ":\n";

        if (-f $file) { print "---- ist Datai\n"; }
        else { print "---- ist nicht eine Datei!!!\n"; }
}

Вот команды:

[andrey @ andreys-comp testdir] $ ls -l innerdir /
всего 4
-rw-rw-r-- 1 andrey andrey 0 18 июня 22:02 innertestfile
[andrey @ andreys-comp testdir] $ ./test.pl
++ с относительным путем ++
.:
---- ist nicht eine Datei !!!
./test.pl:
---- ist Datai
./testfile:
---- ist Datai
./innerdir:
---- ist nicht eine Datei !!!
./innerdir/innertestfile:
---- ist nicht eine Datei !!!

++ С текущим модулем рабочего каталога ++
/ home / andrey / testdir:
---- ist nicht eine Datei !!!
/ home / andrey / testdir / test.pl:
---- ist Datai
/ home / andrey / testdir / testfile:
---- ist Datai
/ home / andrey / testdir / innerdir:
-- ist nicht eine Datei !!!
/ home / andrey / testdir / innerdir / innertestfile:
---- ist Datai

ist Datei: есть файл
ist nicht eine Datei: это не файл (мне просто нравится немецкий :))

Укажите, что в первом методе ./innerdir/innertestfile не определяется как файл, а не во втором.

0 голосов
/ 16 июня 2010

Как насчет проверки с

if (! -f $file) { 
   die "not a file";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...