2011-11-18 4 views
2

Привет всем, мне было интересно, как я могу искать файлы в perl.Поиск файлов с определенным Regex в имени файла в Perl

Прямо сейчас у меня есть строка с информацией, которую я обозначил как вкладка как разделитель, хранящийся в массиве. (с использованием split) Эти массивы содержат заглушку текста имен файлов, которые я хочу найти в каталоге. Например, Engineering_4.txt будет просто «Engin» в моем массиве.

Если есть два разных файла ... Engineering_4 и Engineering_5, он будет искать оба этих файла для контента и просто извлекать нужную мне информацию из одной из них (только 1 содержит информацию, которую я хочу). Я бы предположил, что мой скрипт должен будет искать и хранить все имена файлов, которые соответствуют, а затем выполняют поиск по каждому из этих файлов.

Мой вопрос: как мне искать файлы в каталоге, соответствующем регулярному выражению в Perl? Также есть способ ограничить типы файлов, которые я хочу найти. Например, я просто хочу только искать файлы «.txt».

Спасибо всем

ответ

4

Я предполагаю, так как вы уже знаете, каталог вы можете открыть его и прочитать его, а также ее фильтрации:

opendir D, 'yourDirectory' or die "Could not open dir: $!\n"; 
my @filelist = grep(/yourRegex/i, readdir D); 
0

Вы можете сделать это с помощью glob функции <glob> оператора.

while (<Engin*.txt>) { 
print "$_\n"; 
} 
0

glob функция возвращает массив соответствующих файлов при условии подстановки выражения.

Это означает, что файлы могут быть также sort -ed перед обработкой:

use Sort::Key::Natural 'natsort'; 

foreach my $file (natsort glob "*.txt") { # Will loop over only txt files 

    open my $fh, '<', $file or die $!; # Open file and process 
} 
0

Вы также можете использовать File :: Find модуль:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use File::Find; 
my @dirs = @ARGV ? @ARGV : ('.'); 
my @list; 
find(sub{ 
    push @list, $File::Find::name if -f $_ && $_ =~ m/.+\.txt/ }, 
    @dirs); 
print "$_\n" for @list; 
Смежные вопросы