The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Template::Plugin::MARC - Template::Toolkit plugin to make MARC friendly


    [% USE record = MARC(mymarc) %] <!-- translate MARC::Record to T::T hash -->
    <h1>[% %]</h1> <!-- subfield 245$a -->
    [% record.f245.all %] <!-- all subfields concatenated together -->
    [% FOREACH link IN record.f856s %] <!-- process each 856 field -->
       <a href="whatever/[% %]">[% %]</a> <!-- create a link on 856$y -->
    [% END %] <!-- /FOREACH link IN record.856s -->
    [% FOREACH contents IN record.f505s %] <!-- process each 505 field -->
       [% FOREACH subf IN contents.subfields %] <!-- process each subfield -->
           [% SWITCH subf.code %]
           [% CASE 'a' %]
               <span class='contents'>[% subf.value %]</span>
           [% CASE 't' %]
               <span class='title'>[% subf.value %]</span>
           [% CASE 'r' %]
               <span class='responsibility'>[% subf.value %]</span>
           [% END %]
       [% END %] <!-- /FOREACH contents.subfields -->
    [% END %] <!-- /FOREACH contents IN record.f505s -->
    [% FOREACH subj IN record.f6xxs %]
       <a href="whatever/[% subj.s9 %]">[% %]</a> <!-- create a link on 6[0-9]{2}$a -->
    [% END %]
    [% FOREACH field IN record.fields %]
       [% SWITCH field.tag %]
       [% CASE '600' %]
           Subject: [% field.all %] is what we are all about
       [% CASE '700' %]
           Co-author: [% field.all %], I presume?
       [% END %]
    [% END %]


A Template::Toolkit plugin which given a MARC::Record object parses it into a hash that can be accessed directly in Template::Toolkit.


By using some clever AUTOLOAD acrobatics, this plugin offers the user six types of accessors.

Direct accessors

    [% %]
    print $record->f245->sa;

By prefixing field numbers with an 'f' and subfield codes with an 's', the first field/subfield with a given tag/code can be accessed.

Concatenated accessors

    [% record.f245.all %]
    print $record->f245->all;

A string consisting of all subfields concatenated together is accessible through the all member of field objects.

Subfield iterators

    [% FOREACH subfield IN record.f245.subfields %]
        [% subfield.code %] = [% subfield.value %]
    [% END %]

    foreach my $subfield ($record->f245) {
        print $subfield->code, ' = ', $subfield->value;

Subfield iterators are accessible through the subfields member of field objects.

Field iterators

    [% FOREACH field IN record.f500s %]
        [% field.all %]
    [% END %]

    foreach my $field ($record->f500s) {
        print $field->all;

Field iterators are accessible by adding an 's' to the end of field names: f500s, etc.

Section iterators

    [% FOREACH field IN record.f5xxs %]
        [% field.all %]
    [% END %]

    foreach my $field ($record->f5xxs) {
        print $field->all;

All the fields in a section (identified by the first digit of the tag) can be accessed with 'fNxxs' and then iterated through.

Complete field list

    [% FOREACH field IN record.fields %]
        [% field.all %]
    [% END %]

    foreach my $field ($record->fields) {
        print $field->all;

All the fields in a record can be accessed via the fields object method.


This plugin will not sanity-check your code to make sure that you are accessing fields and subfields with proper allowances for repetition. If you access a value using [% %] it is presumed that was intentional, and there will be no warning or error of any sort.

However, the flip-side of this is that this plugin will not dictate your code style. You can access the data using direct (non-repeatable) accessors, by iterating over subfields, by iterating over subfields of a specific tag, by iterating over fields in a particular block (0xx, 1xx, 2xx, etc.), or by iterating over all fields.



Used by Template::Toolkit for loading this plugin.


Instantiates a new object for the given MARC::Record. Can be called using any of the following declarations:

    [% USE MARC(mymarc) %]
    [% USE marc(mymarc) %]
    [% USE MARC mymarc %]
    [% USE MARC(marc=mymarc) %]
    [% USE MARC marc=mymarc %]

When run from Perl, the object can be created with either of the following two calling conventions:

    $record = Template::Plugin::MARC->new({}, $marc, [\%config]);
    $record = Template::Plugin::MARC->new([$context], { marc => $marc });

The $context hashref passed as the first argument is mandatory when using positional parameters and optional when using named parameters.


Initializes the MARC object. This is called only on the first access attempt on the object, to avoid unnecessary processing.


    $record->filter({ '4' => 'edt' })->[0]->sa

    [% record.filter('4'='edt')

Filters a set of fields according to the specified criteria


Returns the MARC::Record object associated with the instance.


MARC::Record, Template::Toolkit


Jared Camins-Esakov, C & P Bibliography Services <>


Copyright (C) 2012 by C & P Bibliography Services

Template::Plugin::MARC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <>.