Problem: When you request an indicator or subfield for tags less than 010, MARC::Field will croak(), causing the script to fail.
Discussion: Since MARC tags less than 010 can not have indicators or subfields, not allowing those ::Field methods to be called on those tags make sense. However, this should be a warn(), not a croak(), otherwise looping code will need to conditionally check tag numbers before continued processing. For example, in MARC::Doc::Tutorial, one of the examples is: use MARC::Batch; my $batch = MARC::Batch->new('USMARC','file.dat'); my $record = $batch->next(); my @fields = $record->fields; foreach my $field (@fields) { print $field->tag(), " ", $field->indicator(1), $field->indicator(2) || undef, " ", $field->as_string, " ", "\n"; } The purpose of the code is to print out each and every bit of the MARC record. If "file.dat" is the t/camel.usmarc file, the above code immediately fails: Fields below 010 do not have indicators at test.pl line 13 For the code to work as intended, revisions like this would be needed: use MARC::Batch; my $batch = MARC::Batch->new('USMARC','file.dat'); my $record = $batch->next(); my @fields = $record->fields; foreach my $field (@fields) { print $field->tag(), " "; if ($field->tag() > 10) { print $field->indicator(1); print $field->indicator(2); } print $field->as_string, " \n"; } There's certainly nothing wrong with the above code, but it does seem like extra work mental work that should, and can, be prevented. Possible Solution: Instead of croaking, warn() instead, with the ability to warnings_off(). The attached patch to the latest CPAN MARC::Field implements this, changing the following croaks to $self->_warn: Field.pm: croak( "Fields below 010 do not have indicators" ) Field.pm: croak( "Fields below 010 do not have subfields" ) Field.pm: croak( "data() is only for tags less than 010" ) The example recipe will also need to be revised to handle undef'd values - the relevant print statement is below. Taking care to check for undef's is extra code, but more in line with careful Perl programming than MARC rules. print $field->tag(), " ", defined $field->indicator(1) ? $field->indicator(1) : "", defined $field->indicator(2) ? $field->indicator(2) : "", $field->as_string, " ", "\n"; } Other Notes: I believe there's an error in the ::Field POD documentation. In the indicator and subfield intro's, we're told that MARC:: Field::ERROR will be set at various instances. I don't believe this is the case - the only time ERROR is set is when the _gripe routine is called, and the _gripe routine is .. . never .. called. MARC::Record calls its own internal _gripe routine twice: return _gripe( $MARC::Field::ERROR ); but would seem to always return undef, as ERROR is never set. The attached patch does not address ANY of the above, as I'm not sure if I'm missing something. Someone please confirm - I can do the leg work to correct the POD (or, fix the code, depending on how you think it should be fixed). -- Morbus Iff ( small pieces of morbus loosely joined ) Technical: http://www.oreillynet.com/pub/au/779 Culture: http://www.disobey.com/ and http://www.gamegrene.com/ icq: 2927491 / aim: akaMorbus / yahoo: morbus_iff / jabber.org: morbus
%
Description: application/applefile
Field.patch
Description: Binary data