[libcatmandu-marc-perl] 194/208: Adding more POD

Jonas Smedegaard dr at jones.dk
Sat Oct 28 03:42:49 UTC 2017


This is an automated email from the git hooks/post-receive script.

js pushed a commit to annotated tag upstream/1.19
in repository libcatmandu-marc-perl.

commit b237bca1aaadf38701c4c36c4dec3286fb0a1cc9
Author: Patrick Hochstenbach <patrick.hochstenbach at ugent.be>
Date:   Sat Jul 22 11:40:26 2017 +0200

    Adding more POD
---
 lib/Catmandu/Fix/marc_copy.pm  |  30 +++++++
 lib/Catmandu/Fix/marc_cut.pm   |  30 +++++++
 lib/Catmandu/MARC/Tutorial.pod | 174 +++++++++++++++++++++++++++++++++++++++--
 3 files changed, 229 insertions(+), 5 deletions(-)

diff --git a/lib/Catmandu/Fix/marc_copy.pm b/lib/Catmandu/Fix/marc_copy.pm
index 9efe1a1..2e53bc7 100644
--- a/lib/Catmandu/Fix/marc_copy.pm
+++ b/lib/Catmandu/Fix/marc_copy.pm
@@ -143,6 +143,36 @@ need to be copied:
     # Copy all the 300 fields which have subfield c equal to 'ABC'
     marc_copy(300c,tmp,equal:"^ABC")
 
+=head1 JSON PATHS
+
+Catmandu Fixes can be used to edit the data in the copied fields. To have easy access
+to the data in the copied fields, these JSON paths can be used (where VAR is the
+name of field into which you copied the data)
+
+    VAR.*.tag       - The names of all MARC tags
+    VAR.*.ind1      - All first indicators
+    VAR.*.ind2      - All second indicators
+    VAR.*.subfields.*.a - The value of all $a subfields
+    VAR.*.subfields.$first.a - The value of the first $a subfield
+    VAR.*.subfields.$last.a - The value of the last $a subfield
+    VAR.*.content   - The value of the first control field
+
+    VAR.$first.subfields.$first.z - The value of the second $z subfield in the first MARC field
+
+These JSON paths can be used like:
+
+    # Set the first indicator of all 300 fields
+    do marc_each()
+      if marc_has(300)
+        marc_copy(300,tmp)
+
+        # Set the first indicator to 1
+        set_field(tmp.*.ind1,1)
+
+        marc_paste(tmp)
+      end
+    end
+
 =head1 INLINE
 
 This Fix can be used inline in a Perl script:
diff --git a/lib/Catmandu/Fix/marc_cut.pm b/lib/Catmandu/Fix/marc_cut.pm
index fa33345..19b98b0 100644
--- a/lib/Catmandu/Fix/marc_cut.pm
+++ b/lib/Catmandu/Fix/marc_cut.pm
@@ -101,6 +101,36 @@ need to be copied:
     # Cut all the 300 fields which have subfield c equal to 'ABC'
     marc_cut(300c,tmp,equal:"^ABC")
 
+=head1 JSON PATHS
+
+Catmandu Fixes can be used to edit the data in the cut fields. To have easy access
+to the data in the copied fields, these JSON paths can be used (where VAR is the
+name of field into which you copied the data)
+
+    VAR.*.tag       - The names of all MARC tags
+    VAR.*.ind1      - All first indicators
+    VAR.*.ind2      - All second indicators
+    VAR.*.subfields.*.a - The value of all $a subfields
+    VAR.*.subfields.$first.a - The value of the first $a subfield
+    VAR.*.subfields.$last.a - The value of the last $a subfield
+    VAR.*.content   - The value of the first control field
+
+    VAR.$first.subfields.$first.z - The value of the second $z subfield in the first MARC field
+
+These JSON paths can be used like:
+
+    # Set the first indicator of all 300 fields
+    do marc_each()
+      if marc_has(300)
+        marc_cut(300,tmp)
+
+        # Set the first indicator to 1
+        set_field(tmp.*.ind1,1)
+
+        marc_paste(tmp)
+      end
+    end
+
 =head1 INLINE
 
 This Fix can be used inline in a Perl script:
diff --git a/lib/Catmandu/MARC/Tutorial.pod b/lib/Catmandu/MARC/Tutorial.pod
index 8e8ffdc..0e97114 100644
--- a/lib/Catmandu/MARC/Tutorial.pod
+++ b/lib/Catmandu/MARC/Tutorial.pod
@@ -232,6 +232,174 @@ output
 
     $ catmandu -D convert MARC to Null --fix myfix.fix < data.mrc
 
+=head1 TRANSFORMING
+
+=head2 Add a new MARC field
+
+In the example bellow we add new 856 field to the record with a $u subfield containing
+the Google homepage:
+
+   marc_add(856,u,"http://www.google.com")
+
+A control field can be added by using the '_' subfield
+
+   marc_add(009,_,0123456789)
+
+Maybe you want to copy the data from one subfield to another. Use the marc_map to
+store the data first in a temporary field and add it later to the new field:
+
+   # copy a subfield
+   marc_map(001,tmp)
+
+   # maybe process the data a bit
+   append(tmp,"-mytest")
+
+   # add the contents of the tmp field to the new 009 field
+   marc_add(009,_,$.tmp)
+
+=head2 Set a MARC subfield
+
+Set the $h subfield to a new value (or create it when it doesn't exist yet):
+
+   marc_set(100h, test123)
+
+Only set the 100 field if the first indicator is 3
+
+   marc_set(100[3]h, test123)
+
+=head2 Remove a MARC (sub)field
+
+Remove all fields 500 , 501 , 5** :
+
+   marc_remove(5**)
+
+Remove all 245h fields:
+
+   marc_remove(245h)
+
+=head2 Append text to a MARC field
+
+Append a period to the 500 field is there isn't already there:
+
+  do marc_each()
+    unless marc_match(500, "\.$")    # Only if the current field 500 doesn't end with a period
+      marc_append(500,".")           # Add to the current 500 field a period
+    end
+  end
+
+Use the L<Catmandu::Fix::Bind::marc_each> Bind to loop over all MARC fields. In the
+context of the C<do -- end> only one MARC field at a time is visible for the C<marc_*> fixes.
+
+=head2 The marc_each binder
+
+All C<marc_*> fixes will operate on all MARC fields matching a MARC path. For example,
+
+   marc_remove(856)
+
+will remove all 856 MARC fields. In some cases you may want to change only some of the fields
+in a record. You could write:
+
+  if marc_match(856u,"google")
+     marc_remove(856)
+  end
+
+in the hope it would remove the 856 fields that contain the text "google" in the $u subfield.
+Alas, this is not what will happen. The C<if> condition will match when the record contains one or
+more 856u fields containing "google". The C<marc_remove> Fix will delete B<all> 856 fields. To
+correctly remove only the 856 fields in the context of the C<if> statement the C<marc_each> binder
+is required:
+
+  do marc_each()
+    if marc_match(856u,"google")
+       marc_remove(856)
+    end
+  end
+
+The C<marc_each> will loop over all MARC fields one at a time. The if statement will only match when
+the current MARC field is 856 and the $u field contains "google". The C<marc_remove(856)> will only
+delete the current 856 field.
+
+In C<marc_each> binder, it seems for all Fixes as if there is only one field at a time visible in the record.
+This Fix will not work:
+
+  do marc_each()
+    if marc_match(856u,"google")
+       marc_remove(900)           # <-- there is only a 856 field in the current context
+    end
+  end
+
+=head2 marc_copy, marc_cut and marc_paste
+
+The L<Catmandu::Fix::marc_copy>, L<Catmandu::Fix::marc_cut>, L<Catmandu::Fix::marc_paste> Fixes
+are needed when complicated edits are needed in MARC record.
+
+The C<marc_copy> fill copy parts of a MARC record matching a MARC_PATH to a temporary variable.
+This tempoarary variable will contain an ARRAY of HASHes containing the content of the MARC field.
+
+For instance,
+
+  marc_copy(650, tmp)
+
+The C<tmp> will contain something like:
+
+  tmp:[
+      {
+          "subfields" : [
+              {
+                  "a" : "Perl (Computer program language)"
+              }
+          ],
+          "ind1" : " ",
+          "ind2" : "0",
+          "tag" : "650"
+    },
+    {
+          "ind1" : " ",
+          "subfields" : [
+              {
+                  "a" : "Web servers."
+              }
+          ],
+          "tag" : "650",
+          "ind2" : "0"
+    }
+  ]
+
+This structure can be edited with all the Catmandu fixes. For instance you can set the first
+indicator to '1':
+
+  set_field(tmp.*.ind1 , 1)
+
+The JSON path C<tmp.*.ind1> will match all the first indicators. The JSON path
+C<tmp.*.tag> will match all the MARC tags. The JSON path C<tmp.*.subfields.*.a> will
+match all the $a subfields. For instance, to change all 'Perl' into 'Python' in the $a subfield
+use this Fix:
+
+  replace_all(tmp.*.subfields.*.a,"Perl","Python")
+
+When the fields need to be places back into the record the C<marc_paste> command can be used:
+
+   marc_paste(subjects)
+
+This will add all 650 fields in the C<tmp> temporary variable at the B<end> of the record. You can
+change the MARC fields in place using the C<march_each> binder:
+
+  do marc_each()
+     # Select only the 650 fields
+     if marc_has(650)
+        # Create a working copy
+        marc_copy(650,tmp)
+
+        # Change some fields
+        set_field(tmp.*.ind1 , 1)
+
+        # Paste the result back
+        marc_paste(tmp)
+     end
+  end
+
+The C<marc_cut> Fix works like C<marc_copy> but will delete the matching MARC field from the record.
+
 =head2 Rename MARC subfields
 
 In the example below we rename each $1 subfield in the MARC record to $0 using
@@ -250,16 +418,12 @@ fixes:
        marc_paste(tmp)
     end
 
-Put this Fix script in a file C<myfix.fix> and execute the Catmandu command:
-
-  $ catmandu convert MARC to MARC --fix myfix.fix < data.mrc > output.mrc
-
 The C<marc_each> bind will loop over all the MARC fields. With C<marc_cut> we
 store any field (C<***> matches every field) into a C<tmp> field. The C<marc_cut>
 creates an array structure in C<tmp> which is easy to process using the Fix
 language. Using the C<rename> function we search for all the subfields, and replace
 the field matching the regular expression C<1> with C<0>. At the end, we paste
-back the C<tmp> field into the record.  
+back the C<tmp> field into the record.
 
 =head1 WRITING
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libcatmandu-marc-perl.git



More information about the Pkg-perl-cvs-commits mailing list