Автор Тема: Конфиликт в самописном ОО модуле  (Прочитано 2259 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Помогите разобраться со следующе проблемой.
Я пишу ОО модуль, для работы с файлами. Сейчас написано 3 метода, и они если их вызывать поочереди, странно себя ведут.
Вот какие это методы:

sub FetchRecord {
my $obj=shift;
my $fh=$obj->{\'file\'};
my %param=@_;

while(defined(my $line=<$fh>)) {
        chomp($line);
my($id,@REC)=split(/\\|/,$line);
return \\@REC if($id eq $param{\'-id\'});
}
my @ERR=();
push(@ERR,"record by id $param{\'-id\'} not found");
return \\@ERR;
}

sub FetchLastRecords {
my $obj=shift;
my $fh=$obj->{\'file\'};
my %param=@_;
$param{\'-num\'}=1 unless(exists($param{\'-num\'}));
my @LIST=<$fh>;
$param{\'-num\'}=$param{\'-num\'}>@LIST ? @LIST : $param{\'-num\'};
@LIST=splice(@LIST,-$param{\'-num\'});
return \\@LIST if exists($param{\'-raw\'});
my @LIST_CUT=();
foreach (@LIST) {
chomp;
s/\\|/ /g;
push(@LIST_CUT,$_);
}
return \\@LIST_CUT;
}

sub FetchFileToHash {
my $obj=shift;
my $fh=$obj->{\'file\'};
my %hash=();
while(defined(my $line=<$fh>)) {
        chomp($line);
my($id,@REC)=split(/\\|/,$line);
$hash{$id}=\\@REC;
}
return %hash;
}


Создание объекта происходит так:

sub new {
my $class=shift;
my %arg=@_;
$arg{\'-path\'}="." unless(exists($arg{\'-path\'}));
die "Bad file name" unless(-e "$arg{\'-path\'}/$arg{\'-file\'}");
my $fh;
block($arg{\'-path\'},LOCK_SH);# внутренняя функция пакета (блокировка через файл семафор)
open($fh,"<","$arg{\'-path\'}/$arg{\'-file\'}") || die "Can\'t open file: $!";
my $self={
          file => $fh,
          };
bless($self,$class);
return $self;
}

То есть я таскаю с собой дескриптор файла, который извлекаю в методах. И вот именно в этом проблема. Если я вызываю в скрипте сперва метод FetchFileToHash, а потом остальные, то в оставшихся двух методах почему-то не происходит чтение из дескриптора $fh. Если вызываю сперва FetchRecord, потом FetchFileToHash, а за ним FetchLastRecords, то в последнем методе снова не происходит чтение из дескриптора $fh. Короче - никак не могу отловить здесь ошибку. Пробовал запускать методы без блокировки файлов (думал проблема тут) - но результат тот же. Дескриптор $fh при этом определен во всех методах и имеет одинаковый адрес, но вот почему-то чтение из него возможно только в одном или двух случаях из трех?
Ворота в perl - perlmonks.org.ru

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Конфиликт в самописном ОО модуле
« Ответ #1 : 09 Мая 2005, 13:14:13 »
Упс. Тему можно закрывать - решение было в функции seek :)
Ворота в perl - perlmonks.org.ru

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28