NAME
MARC::Record - Perl extension for handling MARC records
VERSION
Version 0.92
$Id: Record.pm,v 1.14 2002/04/02 18:00:37 petdance Exp $
DESCRIPTION
Module for handling MARC records as objects. The file-handling stuff is in MARC::File::*.
EXPORT
None.
ERROR HANDLING
Any errors generated are stored in $MARC::Record::ERROR
. Warnings are kept with the record and accessible in the warnings()
method.
METHODS
new()
Base constructor for the class. It just returns a completely empty record. To get real data, you'll need to populate it with fields, or use one of the MARC::File::* modules to read from a file.
clone( [field specs] )
The clone()
method makes a copy of an existing MARC record and returns the new version. Note that you cannot just say:
my $newmarc = $oldmarc;
This just makes a copy of the reference, not a new object. You must use the clone()
method like so:
my $newmarc = $oldmarc->clone;
You can also specify field specs to filter down only a certain subset of fields. For instance, if you only wanted the title and ISBN tags from a record, you could do this:
my $small_marc = $marc->clone( 245, '020' );
The order of the fields is preserved as it was in the original record.
leader([text])
Returns the leader for the record. Sets the leader if text is defined. No error checking is done on the validity of the leader.
set_leader_lengths( $reclen, $baseaddr )
Internal function for updating the leader's length and base address.
add_fields()
Adds MARC::Field
objects to the end of the list. Returns the number of fields added, or undef
if there was an error.
There are three ways of calling add_fields()
to add data to the record.
- 1 Create a MARC::Field object and add it
-
my $author = MARC::Field->new( 100, "1", " ", a => "Arnosky, Jim." ); $marc->add_fields( $author );
- 2 Add the data fields directly, and let
add_fields()
take care of the objectifying. -
$marc->add_fields( 245, "1", "0", a => "Raccoons and ripe corn /", c => "Jim Arnosky.", );
- 3 Same as #2 above, but pass multiple fields of data in anonymous lists
-
$marc->add_fields( [ 250, " ", " ", a => "1st ed." ], [ 650, "1", " ", a => "Raccoons." ], );
delete_field($field
)
Deletes a field from the record.
The field must have been retrieved from the record using the field()
method. For example, to delete a 526 tag if it exists:
my $tag526 = $marc->field( "526" );
if ( $tag526 ) {
$marc->delete_field( $tag526 );
}
delete_field()
returns the number of fields that were deleted. This shouldn't be 0 unless you didn't get the tag properly.
fields()
Returns a list of all the fields in the record.
field(tagspec(s))
Returns a list of tags that match the field specifier, or in scalar context, just the first matching tag.
The field specifier can be a simple number (i.e. "245"), or use the "X" notation of wildcarding (i.e. subject tags are "6XX").
subfield(tag,subfield)
Shortcut method for getting just a subfield for a tag. These are equivalent:
my $title = $marc->field(245)->subfield("a");
my $title = $marc->subfield(245,"a");
If either the field or subfield can't be found, undef
is returned.
as_formatted()
Returns a pretty string for printing in a MARC dump.
title()
Returns the title from the 245 tag. Note that it is a string, not a MARC::Field
record.
author()
Returns the author from the 100, 110 or 111 tag. Note that it is a string, not a MARC::Field
record.
new_from_usmarc( $marcblob )
This is a wrapper around MARC::File::USMARC::decode()
for compatibility with older versions of MARC::Record.
as_usmarc( $marcblob )
This is a wrapper around MARC::File::USMARC::encode()
for compatibility with older versions of MARC::Record.
warnings()
Returns the warnings that were created when the record was read. These are things like "Invalid indicators converted to blanks".
The warnings are items that you might be interested in, or might not. It depends on how stringently you're checking data. If you're doing some grunt data analysis, you probably don't care.
DESIGN NOTES
A brief discussion of why MARC::Record is done the way it is:
It's built for quick prototyping
One of the areas Perl excels is in allowing the programmer to create easy solutions quickly.
MARC::Record
is designed along those same lines. You want a program to dump all the 6XX tags in a file?MARC::Record
is your friend.It's built for extensibility
Currently, I'm using
MARC::Record
for analyzing bibliographic data, but who knows what might happen in the future?MARC::Record
needs to be just as adept at authority data, too.It's designed around accessor methods
I use method calls everywhere, and I expect calling programs to do the same, rather than accessing internal data directly. If you access an object's hash fields on your own, future releases may break your code.
It's not built for speed
One of the tradeoffs in using accessor methods is some overhead in the method calls. Is this slow? I don't know, I haven't measured. I would suggest that if you're a cycle junkie that you use
Benchmark.pm
to check to see where your bottlenecks are, and then decide ifMARC::Record
is for you.
RELATED MODULES
SEE ALSO
perl4lib (http://www.rice.edu/perl4lib/)
A mailing list devoted to the use of Perl in libraries.
Library Of Congress MARC pages (http://www.loc.gov/marc/)
The definitive source for all things MARC.
Understanding MARC Bibliographic (http://lcweb.loc.gov/marc/umb/)
Online version of the free booklet. An excellent overview of the MARC format. Essential.
Tag Of The Month (http://www.tagofthemonth.com/)
Follett Software Company's (http://www.fsc.follett.com/) monthly discussion of various MARC tags.
TODO
Incorporate MARC.pm in the distribution.
Combine MARC.pm and MARC::* into one distribution.
Podify MARC.pm
Allow regexes across the entire tag
Imagine something like this:
my @sears_headings = $marc->tag_grep( /Sears/ );
(from Mike O'Regan)
Insert a field in an arbitrary place in the record
Allow deleting a field
for my $field ( $record->field( "856" ) ) { $record->delete_field( $field ) unless useful($field); } # for
(from Anne Highsmith hismith@tamu.edu)
Modifying an existing field
IDEAS
Ideas are things that have been considered, but nobody's actually asked for.
Create multiple output formats.
These could be ASCII, XML, or MarcMaker.
Create a clone of a record based on criteria
LICENSE
This code may be distributed under the same terms as Perl itself.
Please note that these modules are not products of or supported by the employers of the various contributors to the code.
AUTHOR
Andy Lester, <marc@petdance.com> or <alester@flr.follett.com>
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 126:
=pod directives shouldn't be over one line long! Ignoring all 3 lines of content