Deal with library-of-congress call numbers
Version 0.22;
Utility functions to deal with Library of Congress Call Numbers
use Library::CallNumber::LC; my $a = Library::CallNumber::LC->new('A 123.4 .c11'); print $a->normalize; # normalizes for string comparisons. # gives 'A01234 C11' print $a->start_of_range; # same as "normalize" my $b = Library::CallNumber::LC->new('B11 .c13 .d11'); print $b->normalize; # gives 'B0011 C13 D11' my @range = ($a->start_of_range, $b->end_of_range); # end of range is 'B0011 C13 D11~' # Get components suitable for printing (e.g., number and decimal joined, leading dot on first cutter) @comps = Library::CallNumber::LC->new('A 123.4 .c11')->components() # Same thing, but return empty strings for missing components (e.g., the cutters) @comps = Library::CallNumber::LC->new('A 123.4 .c11')->components('true');
Library::CallNumber::LC is mostly designed to do call number normalization, with the following goals:
The normalized call numbers are comparable with each other, for proper sorting
The normalized call number is a short as possible, so left-anchored wildcard searches are possible (e.g., searching on \*(L"A11*\*(R" should give you all the A11 call numbers)
A range defined by start_of_range and end_of_range should be correct, assuming that the string given for the end of the range is, in fact, a left prefix.
That last point needs some explanation. The idea is that if someone gives a range of, say, A-AZ, what they really mean is A - \s-1AZ9999\s0.99. The end_of_range method generates a key which lies immediately beyond the last possible key for a given starting point. There is no attempt to make end_of_range normalization correspond to anything in real life.
The text of the call number we are dealing with.
Specify which character occupies the 'always-sort-to-the-top' slots in the sort keys. Defaults to the \s-1SPACE\s0 character, but can reasonably be anything with an \s-1ASCII\s0 value lower than 48 (i.e. the 'zero' character, '0'). This can function as either a class or instance method depending on need.
Specify which character occupies the 'always-sort-to-the-bottom' slots in the sort keys. Defaults to the \s-1TILDE\s0 character, but can reasonably be anything with an \s-1ASCII\s0 value higher than 90 (i.e. 'Z'). This can function as either a class or instance method depending on need.
@comps = Library::CallNumber::LC->new('A 123.4 .c11')->components($returnAll)
Returns an array of the individual components of the call number (or undef if it doesn't look like a call number). Components are:
alpha
number (numeric.decimal)
cutter1
cutter2
cutter3
\*(L"extra\*(R" (anything after the cutters)
The optional argument <I returnAll> (false by default) determines whether or not empty components (e.g., extra cutters) get a slot in the returned list.
Base function to perform normalization.
Normalize the stored or passed call number as a sortable string
Alias for normalize
Downshift an lc number so it represents the end of a range
Attempt to turn a call number into an integer value. Possibly useful for fast range checks, although obviously not perfectly accurate. Optional argument $num_digits can be used to control the number of digits used, and therefore the precision of the results.
Current Maintainer: Dan Wells, \*(C`<dbw2 at calvin.edu>\*(C' Original Author: Bill Dueber, \*(C`<dueberb at umich.edu>\*(C'
Please report any bugs or feature requests through the web interface at http://code.google.com/p/library-callnumber-lc/issues/list <http://code.google.com/p/library-callnumber-lc/issues/list>. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
You can find documentation for this module with the perldoc command.
perldoc Library::CallNumber::LC
You can also look for information at the Google Code page:
http://code.google.com/p/library-callnumber-lc/
Copyright 2009 Bill Dueber, all rights reserved. Copyright 2011 Dan Wells, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself and also under the new \s-1BSD\s0 license as described at http://www.opensource.org/licenses/bsd-license.php