Re: A library agnostic datastructure for MARC ?
[email protected] (Paul Hoffman) Fri, 12 Nov 2010 15:28:20 -0500
| Newsgroups | perl.perl4lib |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Nov 12, 2010 at 01:55:32AM +0100, Marc Chantreux wrote:
> hi galen,
>
> On Thu, Nov 11, 2010 at 07:40:35PM -0500, Galen Charlton wrote:
> > I don't see how a structure like this gets you anywhere closer to an
> > abstraction layer that would permit somebody to code in terms of
> > semantic concepts like title and author instead of MARC tags,
>
> It doesn't: the fact is we're working on libraries to do that (see
> MARC::Mapper from my other mail) and i really would like to interact
> both with
>
> - MARC::Record: it's heavily used in the koha ILS
> - the Frederic Demians's MARC lib which is much more modern
Do you mean marc-moose, a.k.a. Marc? No offense to Frederic but it
seems like overkill to me. But then I'm biased -- see below.
> - what we at biblibre call a SimpleRecord which is just a hash of non
> ordered fields
>
> i don't want to write a web of gateways for all those structures and
> those to come so i propose to have a common way to share between all of
> our works.
>
> For example: MARC::Template and ISO2709 have internal code to build
> MARC::Records and SimpleRecords so they depends on MARC::Record. I
> really would like to drop this code for something more generic and
> simple.
>
> > you're looking for a serialization or data structure that is more
>
> i'm not talking about serialization at all, i'm talking about sharing
> data between marc related tools as PSGI does for the web thing. sorry if
> i wasn't clear.
You might be interested in my *non*-object-oriented module -- see
http://search.cpan.org/dist/MARC-Loop/ -- that parses records into a
structure like this:
($leader, \@fields)
Where @fields is a list of array refs, each like this:
[ $tag, \$rawfield, $delete_flag, $i1, $i2, @subfields ]
And @subfields is a list of array refs, each like this:
[ $subid, \$subval ]
No objects, just data, so you get to (read: have to) slice and dice the
data yourself. And of course there's a function that goes the other way
-- and a looping function that was my main justification for writing the
thing in the first place:
use MARC::Loop qw(marcloop TAG DEL);
marcloop {
my ($leader, $fields) = @_;
# Strip all local fields and print the record if there were any
my $changed;
$changed = $_->[DELETE] = 1 for grep { $_->[TAG] =~ /9/ } @$fields;
print marcbuild($leader, $fields) if $changed;
} \*STDIN;
It's meant to be simple (one module, three main functions, ca. 340 LOC
total), robust (won't barf on invalid UTF-8 or bad leaders), and *fast*
-- but if you prefer an object-oriented interface then it's probably not
a good fit.
Paul.
--
Paul Hoffman <[email protected]>