Subject: | Suggestion: Handling Errors |
Good morning,
I have a collection of MARC records with one bad record (tag value has
only one character '0'). When MARC::Record reads this record, it exits
right away, and will not read successive records. So I wonder if you can
just print a warning and adjust the erroneous tag/indicator/code to
something else.
Attached are the original Field.pm and my patch.
Distribution name and version MARC::Record-2.0.0
Perl version: 5.8.8
OS: CentOS 5
Thank you,
Thien
Subject: | Field.pm |
Message body is not shown because it is too large.
Subject: | Field.pm.diff |
--- Field.pm-orig 2007-06-14 10:22:34.000000000 -0400
+++ Field.pm 2007-06-14 10:23:27.000000000 -0400
@@ -57,13 +57,27 @@
my $class = shift;
$class = $class;
+ my $is_control = (@_ == 2);
## MARC spec indicates that tags can have alphabetical
## characters in them! If they do appear we assume that
## they have indicators like tags > 010
my $tagno = shift;
- ($tagno =~ /^[0-9A-Za-z]{3}$/)
- or croak( "Tag \"$tagno\" is not a valid tag." );
- my $is_control = (($tagno =~ /^\d+$/) && ($tagno < 10));
+ if ($tagno !~ /^[0-9A-Za-z]{3}$/) {
+ warn "Tag '$tagno' is not a valid tag.";
+
+ $tagno = ($is_control) ? '000' : 'err';
+ }
+ elsif ($is_control && $tagno >= 10) {
+ warn "Tag '$tagno' is not a valid control field tag.";
+ $tagno = '000';
+ }
+ elsif (!$is_control && $tagno < 10) {
+ warn "Tag '$tagno' is not a valid data field tag.";
+ $tagno = 'err';
+ }
+# ($tagno =~ /^[0-9A-Za-z]{3}$/)
+# or croak( "Tag \"$tagno\" is not a valid tag." );
+# my $is_control = (($tagno =~ /^\d+$/) && ($tagno < 10));
my $self = bless {
_tag => $tagno,
@@ -83,8 +97,8 @@
$self->{$indcode} = $indicator;
} # for
- (@_ >= 2)
- or croak( "Field $tagno must have at least one subfield" );
+# (@_ >= 2)
+# or croak( "Field $tagno must have at least one subfield" );
# Normally, we go thru add_subfields(), but internally we can cheat
$self->{_subfields} = [@_];
@@ -125,7 +139,9 @@
} elsif ( $indno == 2 ) {
return $self->{_ind2};
} else {
- croak( "Indicator number must be 1 or 2" );
+ warn "Indicator number must be 1 or 2\n";
+ return;
+# croak( "Indicator number must be 1 or 2" );
}
}
@@ -164,8 +180,13 @@
my $self = shift;
my $code_wanted = shift;
- croak( "Fields below 010 do not have subfields, use data()" )
- if $self->is_control_field;
+ if ($self->is_control_field) {
+ warn "Fields below 010 do not have subfields, use data()";
+ return;
+ }
+
+# croak( "Fields below 010 do not have subfields, use data()" )
+# if $self->is_control_field;
my @data = @{$self->{_subfields}};
my @found;
@@ -217,8 +238,13 @@
sub data {
my $self = shift;
- croak( "data() is only for tags less than 010, use subfield()" )
- unless $self->is_control_field;
+ if (!$self->is_control_field) {
+ warn "data() is only for tags less than 010, use subfield()";
+ return;
+ }
+
+# croak( "data() is only for tags less than 010, use subfield()" )
+# unless $self->is_control_field;
$self->{_data} = $_[0] if @_;
@@ -238,8 +264,13 @@
sub add_subfields {
my $self = shift;
- croak( "Subfields are only for tags >= 10" )
- if $self->is_control_field;
+ if ($self->is_control_field) {
+ warn "Subfields are only for tags >= 10";
+ return;
+ }
+
+# croak( "Subfields are only for tags >= 10" )
+# if $self->is_control_field;
push( @{$self->{_subfields}}, @_ );
return @_/2;
@@ -276,9 +307,14 @@
my $codes = _normalize_arrayref($options{code});
my $positions = _normalize_arrayref($options{'pos'});
my $match = $options{match};
+
+ if ($match and ref($match) ne 'Regexp') {
+ warn 'match must be a compiled regex';
+ return;
+ }
- croak 'match must be a compiled regex'
- if $match and ref($match) ne 'Regexp';
+# croak 'match must be a compiled regex'
+# if $match and ref($match) ne 'Regexp';
my @current_subfields = @{$self->{_subfields}};
my @new_subfields = ();
@@ -411,13 +447,17 @@
=cut
sub replace_with {
-
my ($self,$new) = @_;
- ref($new) =~ /^MARC::Field$/
- or croak("Must pass a MARC::Field object");
- %$self = %$new;
+ if (ref($new) ne 'MARC::Field') {
+ warn "Must pass a MARC::Field object";
+ return;
+ }
+# ref($new) =~ /^MARC::Field$/
+# or croak("Must pass a MARC::Field object");
+
+ %$self = %$new;
}