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 )