NAME
MARC::Loop - process a batch of MARC21 records
SYNOPSIS
use MARC::Loop qw(marcloop marcbuild TAG VALREF DEL);
my $filehandle = \*STDIN;
my $deleted999 = 0;
my $fixed035 = 0;
marcloop {
my ($leader, $fields, $raw_marc_ref) = @_;
my $changed;
foreach my $field (@$fields) {
if ($field->[TAG] eq '035') {
# Normalize OCLC numbers
my $valref = $field->[VALREF];
$$valref =~ s/\(OCoLC\)oc[mn]0*/(OCoLC)/g;
$fixed035++;
$changed = 1;
}
elsif ($field->[TAG] eq '999') {
# Delete 999 fields
$field->[DEL] = 1;
$deleted999++;
$changed = 1;
}
}
# Print only changed records
print marcbuild($leader, $fields) if $changed;
} $filehandle;
print STDERR "$deleted999 999 fields were deleted\n",
"$fixed035 035 fields were fixed\n";
DESCRIPTION
MARC::Loop is an alternative to MARC::File and MARC::Record that eschews an object-oriented approach in favor of a bare-bones procedural one.
FUNCTIONS
All of these functions are exported upon request.
marcloop
# This example prints a MARC record in human-readable form, using a single
# line for each field no matter how many subfields it might have.
use MARC::Loop qw(marcloop);
marcloop {
my ($leader, $fields, $raw_marc_ref) = @_;
foreach my $field (@$fields) {
if ($field->[TAG] lt '010) {
# Control field
my $valref = $field->[VALREF];
print $field->[TAG], ' ', $$valref, "\n";
}
else {
# Data field
my ($i1, $i2) = ($field->[IND1], $field->[IND2]);
print "$field->[TAG] $i1$i2";
my @subfields = @{ $field->[SUBS..$#$field] };
foreach my $subfield (@subfields) {
my ($code, $valref) = @$subfield;
print '$', $code, ' ', $$valref;
}
print "\n";
}
}
} $filehandle, %options;
Options:
- print_all
-
All MARC records will be printed to STDOUT. Any changes you make will be reflected in what is printed.
- drop array_ref
-
'drop' => [ '001', '090' ]
Tags of fields to be dropped unconditionally.
- only array_ref
-
'only' => [ qw(001 004 008 852 856) ]
Tags of fields to be preserved; all other fields will be dropped. (The leader is never dropped, of course.)
- error
-
A code reference to call when there is an error.
'error' => sub { exit -1 }
- strict
-
'strict' => 1
Halt processing when an ill-formed MARC record is encountered.
Options will be more fully documented in a future release; in the meantime, read the source code.
marcparse
($leader, $fields) = marcparse(\$string, %options);
Parses a MARC record into the same data structure that marcloop uses. Options are mostly the same as for marcloop.
marcbuild
print marcbuild($leader, $fields);
Builds a raw MARC record from the same data structure that marcloop uses and that marcparse produces.
marcfield
# Control field
push $@fields, marcfield(
'001', # Tag
1234567, # Content
);
# Data field
push $@fields, marcfield(
'245', # Tag
' ', ' ', # Indicators
'a' => 'Blah blah', # Subfield $a
'c' => 'Amy Emu', # Subfield $c
... # More subfields
);
A convenience function to build a data structure representing a single MARC21 field.
BUGS
The documentation is woefully lacking and probably just plain wrong. Read the source code -- or, better yet, step through it in the Perl debugger -- to get a better understanding of what this code does.
Unhandled errors cause ill-formed records to be dropped without notice. You must specify an error option to marcloop to get around this.
AUTHOR
Paul Hoffman <paul@flo.org>.
COPYRIGHT
Copyright 2009-2010 Fenway Libraries Online. Released under the GNU Public License, version 3.