Hello,
Two questions please:
1. I've written a script that opens a marc file for reading using this
syntax:
$file = $ARGV[0];
$batch = MARC::Batch->new('USMARC',$file);
It then loops thru the records using this syntax:
while ( $record = $batch->next()) {
.....check position 6, 7 of leader and position 23 of 008 and make
some changes
}
This works great. However, instead of accessing the file this way, I want to
pipe the output of a previously run marc dump command directly into this script
via the pipe.
I understand that this can be done using this syntax: while ($line
=<STDIN>){ ...}, but I don't understand how to use that STDIN with
"MARC::Batch->new('USMARC',$file);" This does not work: $batch =
MARC::Batch->new('USMARC',<STDIN>);
2. My current script successfully reads and processes a marc file of over
5 gigs!....but exits entirely on record 160,585 with the error from
MARC::Batch, "Can't call method "as_string" on an undefined value at
./marc_batch.pl". Documentation on using MARC::Batch says that to tell it to
continue processing even when errors are encountered one should use
strict_off(), then print/report warnings at the bottom of the script. I don't
think my particular error is being handled by the strict_off() setting. Doesn't
anybody know what causes/how to fix "Can't call method as_string?" error? Full
script below-it's pretty short, thanks to MARC::Batch.
Thanks for ensights!
use MARC::Batch;
$file = $ARGV[0];
chomp($file);
$batch = MARC::Batch->new('USMARC',$file);
$batch->strict_off(); # otherwise script exits when encounters errors
open(OUT,'>new_marc');
while ( $record = $batch->next()) {
$leader = $record->leader();
$leader_pos_6 = substr($leader,6,1);
$leader_pos_7 = substr($leader,7,1);
$field = $record->field('008');
$field_008 = $field->as_string();
$field_008_position_23 = substr($field_008,23,1);
if ( ($leader_pos_6 eq "a") && ($leader_pos_7 eq "m") &&
($field_008_position_23 eq "o") || ($field_008_position_23 eq "s") ) {
$control_num = $record->field('001');
$control_num = $control_num->as_string();
print "008 position 23: $field_008_position_23 \n";
print "OLD leader: $leader \n";
$old_leader = $leader;
substr($leader,6,1) = 'm';
print "NEW leader: $leader \n";
print OUT $record->as_usmarc();
print "$control_num|$old_leader|$leader|$field_008\n";
} else { # not a match so just print this one unchanged...
print OUT $record->as_usmarc();
}
}
# handles errors:
if (@warnings = $batch->warnings()) {
print "\n Warnings detected: \n", @warnings;
}
close(OUT);
close(LOG);
John Guillory
Louisiana Library Network
225.578.3758