MARC-Indexer

 view release on metacpan or  search on metacpan

lib/MARC/Indexer.pm  view on Meta::CPAN

    return $1 if $_[0] =~ /^raw:(...)/;
    return substr($_[0], 0, 3);
}

sub index {
    my ($self, $marc) = @_;
    my $marcref = ref($marc) ? $marc : \$marc;
    # 1. Compile the indexing code if needed
    $self->compile if !$self->{'is_compiled'};
    # 2. Gather all fields used for indexing
    my $data = marcdata($marcref, $self->{'want'});
    # 3. Index each term
    my %index;
    while (my ($name, $term) = each %{ $self->{'terms'} }) {
        next if $term->{'derived'};
        my $tag = source2tag($term->{'source'});
        my @vals = @{ $data->{$tag} or next };
        my $eval = $term->{'eval'} or next;
        my $norm = $term->{'norm'};
        @vals = map { $eval->($_) } @vals;
        @vals = map { $norm->($_) } @vals if $norm;
        next if !@vals;
        splice @vals, 1 if !$term->{'repeat'};
        push @{ $index{$name} ||= [] }, @vals;
    }
    return \%index;
}

sub marcdata {
    my ($marcref, $want) = @_;
    my %data;
    $data{'M'} = [$marcref];
    $data{'L'} = [substr($$marcref, 0, 24)] if $want->{'L'};
    my $baseaddr = substr($$marcref, 12, 5) + 0;
    pos($$marcref) = 24;
    while ($$marcref =~ /\G([0-9A-Za-z]{3})([0-9]{4})([0-9]{5})/gc) {
        push @{ $data{$1} ||= [] }, substr($$marcref, $baseaddr + $3, $2 - 1) if $want->{$1};
    }
    return \%data;



( run in 0.282 second using v1.01-cache-2.11-cpan-454fe037f31 )