Как я могу проверить, существует ли имя файла, совпадающее с шаблоном, в Perl?

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

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

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

Ответы

Ответ 1

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

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

foreach (@files) {
    # do something
}

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

if (glob("*.file")) {
    # At least one file matches "*.file"
}

Ответ 2

В системах * 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", он вернет совпадения - полезно для поиска этих имен имен переменных.