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


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

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

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


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


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


Спасибо.

Автор: ginnie 13.8.2008, 16:10
Уважаемый 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 - это Ваши классы, которые читают и упаковывают.

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

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

спасибо.

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

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

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

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

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


Автор: ginnie 14.8.2008, 11:40
Уважаемый 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 строится на основе файлового дескриптора.

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

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