Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hasuhands, Помогите написать скрипт 
:(
    Опции темы
asmlover
Дата 7.8.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.8.2005

Репутация: нет
Всего: нет



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

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

Помогите, если кто знает как написать. Сам в перле и регеспах не силен.
PM MAIL   Вверх
Ivan Kolesnikov
Дата 8.8.2005, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



Необходимо уточнить каким образом делать поиск: искать только в этой директории или и во вложеных тоже.

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

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

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

Это сообщение отредактировал(а) Ivan Kolesnikov - 8.8.2005, 06:48
--------------------
PM MAIL ICQ   Вверх
asmlover
Дата 19.8.2005, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.8.2005

Репутация: нет
Всего: нет



Спасибо разобрался
PM MAIL   Вверх
Гость_Asmlover
Дата 29.8.2005, 03:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А может быть кто-нить делал рекурсивный обходи директории с поиском файла по маске? Я тут эксперементирую с регеспами, но ничего толкового в виду отсутствия опыта не выходит..
  Вверх
Ivan Kolesnikov
Дата 29.8.2005, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



посмотри File::Find

Это сообщение отредактировал(а) Ivan Kolesnikov - 29.8.2005, 12:49
--------------------
PM MAIL ICQ   Вверх
chaos
Дата 29.8.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



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

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

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


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

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

Это сообщение отредактировал(а) chaos - 29.8.2005, 13:47
PM WWW   Вверх
korob2001
Дата 29.8.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



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


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Guest
Дата 29.8.2005, 23:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо.
А не подскажите условие, чтобы обрабатывались только файлы, не ищеющие расширения?
  Вверх
korob2001
Дата 30.8.2005, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



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


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
chaos
Дата 30.8.2005, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



в никс системах вообще нет понятия расширения

PM WWW   Вверх
Guest
Дата 30.8.2005, 09:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну, скажем есть файлы *.cpp - их трогать не надо
А makefile - нужно.
  Вверх
korob2001
Дата 30.8.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Код

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



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 30.8.2005, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



В код надо добавить одну строку:
Код

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


smile

Это сообщение отредактировал(а) sharq - 30.8.2005, 10:33


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0758 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.