Я использую Perl для захвата имен файлов в некоторых указанных папках, в которых есть определенные слова. Ключевыми словами в этих именах файлов являются «предложения» или «очищенные» и «regup» или «regdn». Другими словами, одно из «предложений» или «очищено», и один из «regup» или «regdn» должен появиться в имени файла, чтобы быть положительным. Эти два слова могут быть в любом порядке, и есть символы/слова, которые появятся перед ними и за ними. Соответствующий образец имя файл:Эффективное соответствие набора имен файлов с регулярным выражением в Perl
2day_Agg_AS_Offers_REGDN-09-JUN-11.csv
У меня есть регулярное выражение, которое успешно захватывает каждый из совпавших имен файлов как полный путь, который является тем, что я хотел, но это, кажется, безвкусные и неэффективно. Попытки получить немного лучший код не удались.
Работая подход:
# Get the folder names
my @folders = grep /^\d{2}-/, readdir DIR;
foreach my $folder (@folders) {
# glob the contents of the folder (to get the file names)
my @contents = <$folder/*>;
# For each filename in the list, if it matches, print it
foreach my $item (@contents) {
if ($item =~ /^$folder(?=.*(offers|cleared))(?=.*(regup|regdn)).*csv$/i){
print "$item\n";
}
}
}
Покушение на что-то более короткий/очиститель:
foreach my $folder (@folders) {
# glob the contents of the folder (to get the file names)
my @contents = <$folder/*>;
# Seems to determine that there are four matches in each folder
# but then prints the first matching filename four times
my $single = join("\n", @contents);
for ($single =~ /^$folder(?=.*(offers|cleared))(?=.*(regup|regdn)).*csv$/im) {
print "$&\n";#"Matched: |$`<$&>$'|\n\n";
}
}
Я пробовал другие форматирование с помощью регулярного выражения, используя другие варианты (/ IMG,/мкг, и т.д.) и отправки вывода регулярного выражения в массив, но ничего не работало должным образом. Я не очень хорош в Perl, поэтому я уверен, что у меня отсутствуют некоторые большие возможности, чтобы сделать эту процедуру более эффективной. Благодаря!
Является ли первый набор слов, которые всегда случаются перед вторым набором? – m0skit0
Не обязательно. Слово из (предлагает | очищено) может появляться до или после (regup | regdn). – trynthink
Почему было бы короче или чище использовать 'join' вместо цикла? Я бы сказал, что это усложняет ситуацию. – TLP