Соответствие имени файла с -e и регулярными выражениями в perl - PullRequest
1 голос
/ 08 февраля 2010

Мне нужно проверить наличие файла в каталоге. Имя файла имеет вид, подобный следующему:

/d1/d2/d3/abcd_12345_67890.dat

В моей программе я буду знать имя файла до abcd_

Мне нужно написать условие if с помощью опции -e и найти файлы, соответствующие указанному шаблону.

Ответы [ 4 ]

11 голосов
/ 08 февраля 2010

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

my @files = glob '/d1/d2/d3/abcd_*.dat';

В этом случае нет необходимости выполнять -e filetest.

3 голосов
/ 08 февраля 2010

Нельзя использовать -e для частичных совпадений имен файлов.

use File::Basename;
use File::Slurp;

my ($name, $path) = basename('/d1/d2/d3/abcd_');
my $exists = grep { /^\Q$name\E_[0-9]{5}_[0-9]{5}\.dat\z/ } read_dir $path;

Если каталог содержит много файлов, вы все равно можете поддерживать постоянный размер своей программы, используя opendir и readdir в цикле while.

Я использовал File::Slurp::read_dir здесь, чтобы представить незагроможденное решение.

2 голосов
/ 08 февраля 2010

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

use File::Basename;

$file = "/d1/d2/d3/abcd_12345_67890.dat";

print "SUCCESS" if(-e $file and (basename($file)=~m{^abcd_}))
0 голосов
/ 08 февраля 2010

Как насчет

foreach $f (</d1/d2/d3/*.dat>) {if ($f =~ /\w{4}_\d{5}_\d{5}\.dat/)  {print $f}};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...