++ed by:
KLEE

1 PAUSE user

Patrick Hochstenbach
and 9 contributors

NAME

Catmandu::Fix::marc_copy - copy marc data in a structured way to a new field

SYNOPSIS

    # Cut the 001 field out of the MARC record into the fixed001
    marc_copy(001, fixed001)

    # Cut all 650 fields out of the MARC record into the subjects array
    marc_copy(650, subjects)

DESCRIPTION

Copy MARC data referred by MARC_TAG in a structured way to JSON path.

In contrast to Catmandu::Fix::marc_map and Catmandu::Fix::marc_spec marc_copy will not only copy data content (values) but also all data elements like tag, indicators and subfield codes into a nested data structure.

METHODS

marc_copy(MARC_PATH, JSON_PATH, [equals: REGEX])

Copy this MARC fields referred by a MARC_PATH to a JSON_PATH.

    # Copy all the 300 fields
    marc_copy(300,tmp)

    # Copy all the 300 fields with indicator 1 = 1
    marc_copy(300[1],tmp)

    # Copy all the 300 fields which have subfield c
    marc_copy(300c,tmp)

    # Copy all the 300 fields which have subfield c equal to 'ABC'
    marc_copy(300c,tmp,equal:"^ABC")

    The JSON_PATH C<tmp> will contain an array with one item per field that was copied.
    Each item is a hash containing the following fields:

      tmp.*.tag        - The names of the MARC field
      tmp.*.ind1       - The value of the first indicator
      tmp.*.ind2       - The value of the second indicator
      tmp.*.subfields  - An array of subfield item. Each subfield item is a
                         hash of the subfield code and subfield value

    E.g.

        tmp:
        - tag: '300'
          ind1: ' '
          ind2: ' '
          subfields:
          - a: 'blabla:'
          - v: 'test123'
          - c: 'ok123'

    These JSON paths can be used like:

        # Set the first indicator of all 300 fields
        do marc_each(var:this)
          if all_match(this.tag,300)

            # Set the first indicator to 1
            set_field(this.ind1,1)

            marc_paste(this)
          end
        end

        # Capitalize all the v subfields of 300
        do marc_each(var:this)
            if all_match(this.tag,300)

             do list(path:this.subfields, var:loop)
                if (exists(loop.v))
                    upcase(loop.v)
                end
             end

             marc_paste(this)
          end
        end

INLINE

This Fix can be used inline in a Perl script:

    use Catmandu::Fix::marc_copy as => 'marc_copy';

    my $data = { record => ['650', ' ', 0, 'a', 'Perl'] };

    $data = marc_copy($data,'650','subject');

    print $data->{subject}->[0]->{tag} , "\n"; # '650'
    print $data->{subject}->[0]->{ind1} , "\n"; # ' '
    print $data->{subject}->[0]->{ind2} , "\n"; # 0
    print $data->{subject}->[0]->{subfields}->[0]->{a} , "\n"; # 'Perl'

SEE ALSO

LICENSE AND COPYRIGHT

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.