Поиск файлов с определенным регулярным выражением в имени файла в Perl - PullRequest
2 голосов
/ 18 ноября 2011

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

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

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

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

Спасибо всем

Ответы [ 4 ]

4 голосов
/ 18 ноября 2011

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

opendir D, 'yourDirectory' or die "Could not open dir: $!\n";
my @filelist = grep(/yourRegex/i, readdir D);
0 голосов
/ 18 ноября 2011

Вы также можете использовать модуль 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;
0 голосов
/ 18 ноября 2011

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

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

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 голосов
/ 18 ноября 2011

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

while (<Engin*.txt>) {
 print "$_\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...