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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП, модульное программирование в Perl, как грамотно соединить модули. 
V
    Опции темы
burakov
Дата 13.8.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.
подскажите пожалуйста возможно ли на перл реализовать следующее:

1. есть модуль который читает текстовый файл (в котором прописаны абсолютные пути файлам на диске).

2. а есть модуль который может заархивировать файл  (ну например при помощи zip.exe)
в модуль подставляется имя файла, который нужно заархивировать.


Вопрос:
как передать в программу (объединяющую эти два модуля) из 1 го модуля текущую читаемую строку?
с тем чтобы подставить эту строку во второй модуль для архивирования файла. 


Дополнительное пояснение:
Я не написал что я возвращаю из 1 го модуля, поскольку можно из него вернуть массив, содержащий строки (имена файлов), и тогда понятно как перебирая массив подставить его элементы во второй модуль. Но на этот путь становиться не хочется, потому как текстовый файл, который содержит в себе строки с именами файлов, получается после сканирования HDD и может быть очень большим, поэтому помещение его в массив скажется на производительности.
 
Из 1го модуля необходимо добыть конкретную читаемую в данный момент времени строку...
при этом такую вот придуманную модульность "рушить" не хочется...
поскольку понятно, что задача "заархивировать файлы в каталоге" проста. Суть именно в том как в данном случае сделать это через вот такие вот модули. 


Спасибо.


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ginnie
Дата 13.8.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый burakov, если использовать ООП, то

Код

my $reader = Reader::TextFile->new(filename => 'file.txt');
my $packer = Packer::Zip->new();

while (my $filename = $reader->get_filename()) {
    $packer->packfile(filename => $filename);
}


Классы Reader::TextFile и Packer::Zip - это Ваши классы, которые читают и упаковывают.

Это сообщение отредактировал(а) ginnie - 13.8.2008, 16:12


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
burakov
Дата 14.8.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, красиво получилось.
Еще бы коды этих классов в студию, вообще бы все мои вопросы бы разрешились.
может у Вас какой примерчик готовый есть? ибо
я понял теперь что перл при помощи ООП может реализовать то, что я хочу, но как реально необходимые классы написать я не знаю. 

собственно вопрос теперь в том 
каким образом сработает функция get_filename().
вообщем нужен живой пример классов.

спасибо.

p.s. все таки есть смутное сомнение smile, что предложенный Вами класс 
Reader::TextFile читает файл в массив, а потом 
$reader->get_filename() получает через shift имя файла из массива и все красиво работает.

ну как я уже писал выше на собственном опыте убедился (да и товарищи на этом форуме подсказывают тоже самое), что работать через массив можно и нужно, если количество количество строк положенных в массив НЕВЕЛИКО. в моем же случае количество строк прочитанных

my $reader = Reader::TextFile->new(filename => 'file.txt')

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

Извиняюсь, если я чего не понял...
вообщем на то и форум. очень нужны коды классов...
Спасибо.




--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ginnie
Дата 14.8.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый burakov, вот Вам пример

Код

use strict;
use warnings;
use Reader::TextFile;

my $reader = Reader::TextFile->new( filename => 'test_fh1.pl' );
die $reader unless (ref $reader);

while (my $filename = $reader->get_filename()) {
    print $filename, "\n";
}


Код

package Reader::TextFile;

use strict;
use warnings;

sub new {
    my $class = shift;
    my %args = @_;
    return 'filename undefined' unless ($args{filename});
    my $fh;
    open ($fh, $args{filename}) or return "Can't open file $args{filename}: $!";
    return bless $fh, $class;
}

sub get_filename {
    my $self = shift;
    my $filename = <$self>;
    chomp $filename if $filename;
    return $filename;
}

sub DESTROY {
    my $self = shift;
    close $self;
}

1;


Объект класса Reader::TextFile строится на основе файлового дескриптора.


Это сообщение отредактировал(а) ginnie - 14.8.2008, 11:41


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
burakov
Дата 18.8.2008, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Огромное спасибо.
Все понял. Это действительно то, о чем я спрашивал smile.
И работает так, как мне надо.


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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