Помогите разобраться со следующе проблемой.
Я пишу ОО модуль, для работы с файлами. Сейчас написано 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 при этом определен во всех методах и имеет одинаковый адрес, но вот почему-то чтение из него возможно только в одном или двух случаях из трех?