Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > hasuhands


Автор: asmlover 7.8.2005, 17:36
Помогите. Нужен небольшой скрипт, который открывает файл (лучше - сканирует директорию). находит там файлы заданного расширения и делает следующее:
удаляет пустые строчки до тех пока не встретит первую непустую строку..

Если коротко: нужно удалить из множества файлов пустые строки в начале файла.

Помогите, если кто знает как написать. Сам в перле и регеспах не силен.

Автор: Ivan Kolesnikov 8.8.2005, 06:44
Необходимо уточнить каким образом делать поиск: искать только в этой директории или и во вложеных тоже.

Если только в этой, то тогда вывести список файлов можно следующим скриптом:
Код

use strict;
my $some_dir = 'c:\temp';
my $mask = '.*\.txt$';
opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
my @files = grep { /$mask/ && -f "$some_dir/$_" } readdir(DIR);
print join "\n", @files;
closedir DIR;


Данный пример взят из документации к perl smile

Наибольший интерес вызывает строчка №4. Функция readdir(DIR) в списковом контексте (а здесь именно такой) возвращает массив всех элементов директории, а функция grep добавляет в массив @files только те элементы которые являются текстовыми файлами, а также их имя удовлетворяет критерию $mask (это регулярное выражение).

Если что непонятно пиши будем разбираться.

В случае поиска во вложенных директориях лучше использовать модуль File::Find.

Теперь вторая часть скрипта, имеется файл, необходимо удалить пустые строчки сверху:

Код

my $file = 'aaa.txt';
open(FILE, "<$file");
my @out;
while (<FILE>) {
  push @out, $_ if @out || $_ ne "\n";
};
close(FILE);
open(FILE, ">$file");
print FILE @out;
close(FILE);


Открываем файл на чтение, считываем от туда все строчки, если уже была считана хотя бы одна или строчка не пустая, после этого можно закрыть файл, открыть его для записи и записать туда полученный массив.
Этот скрипт будет не эфективным если файлы большого размера (много будет занимать массив), я бы писал сразу во временный файл вместо массива, а после этого переименовать файл. Попробуй сделать сам, если что поможем smile

Связать два скрипта я думаю не составит труда.

Автор: asmlover 19.8.2005, 02:10
Спасибо разобрался

Автор: Гость_Asmlover 29.8.2005, 03:30
А может быть кто-нить делал рекурсивный обходи директории с поиском файла по маске? Я тут эксперементирую с регеспами, но ничего толкового в виду отсутствия опыта не выходит..

Автор: Ivan Kolesnikov 29.8.2005, 12:49
посмотри File::Find

Автор: chaos 29.8.2005, 13:47
Цитата
А может быть кто-нить делал рекурсивный обходи директории с поиском файла по маске? Я тут эксперементирую с регеспами, но ничего толкового в виду отсутствия опыта не выходит..

ничего сложного, вот не большой алгоритмик
Код

sub ReadDirs {
    my $dirname = shift;
    opendir(DIR, $dirname);
    while (<DIR>) {
        ReadDirs($_) if (-d $_);
    }
    closedir(DIR);
}


ченибудь в таком духе
Добавлено @ 13:53
не спорю можно лутше smile

PS это экспромпт во время перекура smile

Автор: korob2001 29.8.2005, 15:13
Так же советую почитать статью "Удаление ветви дерева каталогов", в FAQ или вот здесь:
http://forum.vingrad.ru/index.php?showtopic=43492
Там описаны методы прохода по всем вложенным каталогам как с помощью модуля File::Find, так и вручную.

Автор: Guest 29.8.2005, 23:02
Спасибо.
А не подскажите условие, чтобы обрабатывались только файлы, не ищеющие расширения?

Автор: korob2001 30.8.2005, 00:00
Не понял вопроса, если можно, чуть подробнее.

Автор: chaos 30.8.2005, 06:13
в никс системах вообще нет понятия расширения

Автор: Guest 30.8.2005, 09:21
Ну, скажем есть файлы *.cpp - их трогать не надо
А makefile - нужно.

Автор: korob2001 30.8.2005, 09:50
Код

opendir( DIR, "." ) or die $!;
    while ( my $file = readdir DIR ) {
                # Следующая строка пропустит файл .cpp
                next if $file =~ /\.cpp$/i;
                # Далее делаем что-то с остальными файлами
    }
closedir( DIR );

Автор: sharq 30.8.2005, 10:26
В код надо добавить одну строку:
Код

my $dir = './';
opendir DIR, $dir or die $!;
while ( my $file = readdir DIR ) {
      # Следующая строка пропустит файл .cpp
      next if $file =~ /.+\.cpp$/i;   
      if (-f $file) {
       # Далее делаем что-то с остальными файлами
      }
}
closedir DIR;


smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)