Provided by: libmarc-loop-perl_0.01-2_all
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.