Как я могу проверить, существует ли имя файла, соответствующее шаблону, в Perl? - PullRequest
14 голосов
/ 19 октября 2010

Могу ли я сделать что-то подобное в Perl? Значение совпадения шаблона по имени файла и проверка его существования.

    if(-e "*.file")
    {
      #Do something
    }

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

Ответы [ 3 ]

33 голосов
/ 19 октября 2010

Вы можете использовать glob, чтобы вернуть массив всех файлов, соответствующих шаблону:

@files = glob("*.file");

foreach (@files) {
    # do something
}

Если вы просто хотите узнать, существует ли файл, соответствующий шаблону, вы можете пропустить назначение:

if (glob("*.file")) {
    # At least one file matches "*.file"
}
0 голосов
/ 18 июля 2018

В Windows мне пришлось использовать File :: Glob :: Windows , так как путь к Windows, разделяющий обратные косые черты, похоже, не работает с глобусом perl.

0 голосов
/ 30 сентября 2013

В * nix системах, я использовал следующие с хорошими результатами.

sub filesExist { return scalar ( my @x = `ls -1a 2> /dev/null "$_[0]"` ) }

Он отвечает количеством найденных совпадений или 0, если его нет. Это делает его легко используемым в условных выражениях типа if:

if( !filesExist( "/foo/var/not*there.log" ) &&
    !filesExist( "/foo/var/*/*.log" ) &&
    !filesExist( "/foo/?ar/notthereeither.log" ) )
{
    print "No matches!\n";
} else {
    print "Matches found!\n";
}

Какие именно шаблоны вы можете использовать, будет зависеть от того, что поддерживает ваша оболочка. Но большинство оболочек поддерживают использование '*' и '?' - и они имеют в виду то же самое везде, что я видел. Конечно, если вы удалите вызов функции 'scalar', она вернет совпадения - полезно для поиска этих имен файлов переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...