Интерфейс RePEc::Index::Collection

Последнее обновление: 2004-09-03 13:58

Collection-класс помогает RePEc-Index разбираться в файлах разного рода.  Collection представляет какой-то набор файлов со своим форматом и правилами.

Когда RePEc-Index надо обработать определённый файл в определённой коллекции, он сначала создаст объект коллекции. (…) Потом он будет делать примерно следующее:


my $t = $collection->open_data_file( $filename );

if ( not $t ) { return 0; }

while( 1 ) {

  my ( $id, $record, $type, $position, $checksum ) = $collection -> get_next_record() ;

  last if not $record;  # get_next_record did not return the record

  # now go check the record id
  if( not $collection -> check_id( $id ) ) {
    # ignore bad record
    next;
  }

  # further processing of the record
  …

} 

Так что всего-то надо определить несколько методов.  Если вы наследуете от RePEc::Index::Collection.  И вы лучше наследуйте.

Методы

monitor_file_checker( )

Метод должен возвращать ссылку на функцию, которая будет решать: обрабатывать файл или нет.  То есть перед тем, как изучать судьбу и содержимое файла, RePEc-Index сделает так:


  my $file_check = $collection -> monitor_file_checker();

  my @files = readdir DIR;  
  foreach ( @files ) {
     …
     my $_ = $relative_filename;
     if ( &$file_check () ) {
        ### process file, take notes about it and so on
        …
     } else {
        ### just ignore it
     }

  }

Эта самая функция должна смотреть в переменную $_, и вернуть true или false, в зависимости от того, актуален или нет этот файл для этой коллекции.  В $_ будет относительное имя файла, относительно вершины коллекции.

monitor_dir_checker( )

Аналогично, только для директорий.

open_data_file( FILENAME )

Метод получает имя файла, пытается его открыть и возвращает положительное (true) значение, если всё в порядке.  Если читать файл не получается, возвращает false.

get_next_record()

Извлечь из ранее открытого файла запись и вернуть её.  Возвращает undef, если записей в файле больше нет, или массив, описывающий запись: ( ID, REC, TYPE, POS, CHECKSUM ).

ID
идентификатор записи, строка
REC
ссылка на запись, объект, perl-структуру, представляющую запись со всем её содержимым (…)
TYPE
тип записи, строка
POS
позиция записи внутри файла, число.  Не обязательно.  Когда не имеет смысла — должно быть равно нулю.
CHECKSUM
контрольная сумма текущего состояния записи, строка

check_id( ID )

Это вспомогательный метод для контроля за некачественными данными. Получает в качестве параметра идентификатор записи и возвращает логическое значение.  Должен вернуть true, если идентификатор нормальный и запись должна дальше обрабатываться.

Мне почему-то был нужен этот метод для обработки RePEc-данных. …?!

Эпилог

Вот и всё.  См. файл RePEc/Index/Collection.pm и файл RePEc/Index/Collection/RePEc.pm в качестве примера Collection-класса. А ещё: RePEc/Index/Collection/RePEcRec.pm, который делает из ReDIF-шаблонов записи, совместимые с ARDB.