On Sep 13, 4:23 pm, [EMAIL PROTECTED] (Tim McGeary) wrote: > Hi all, > > I'm trying to read in two file sets of library records, compare a regex > that I find in different lines of each set of records, and then copy one > whole line over to the other when a match is found. > > To do this, I am trying to use a 3-dimensional array: > [fileset][record][line] > > I think that I am reading and pushing the arrays onto the other arrays > correctly, but when I'm traversing the arrays to do the conditionals, I > am getting uninitialized value warnings, which seems like I'm either not > traversing correctly OR I'm not really pushing the data onto the arrays > properly.
Having looked at your code I very much doubt you are putting the right data into the arrays. Without seeing the input file format it's kinda hard to judge by you seem to be clearing @record too rarely (it just keeps growing) and @line too often (it could nevet have more than one element). I suggest you dump it with Data::Dumper. > This is my whole script below. Does anyone see what I'm doing wrong? By the way, you are suffering from premature declaration. > use strict; > use warnings; > > our $marchead1 = '*** DOCUMENT BOUNDARY ***'; > our $marchead2 = 'FORM=MARC'; > > sub read_records { # read in whole MARC record and push it to @marc > > my @marc; > my @record; > my @line; > open FILE, $_[0] or die qq(Cannot open file $_[0]\n); As a beginner there's little point learning the legacy forms of open(). You should put the error in your error message. open my $file, '<', $_[0] or die qq(Cannot open file $_[0]: $! \n); > print "Opening file $_[0]...\n"; > my $index = -1; > while (<FILE>) { > chomp; > #print "Reading in $_\n"; > if ($_ eq $marchead1) { > if ($index >= 0) { > push @marc, [ @record ]; > print "Pushing record onto marc array...\n"; > print "Next record....\n\n"; > } > $index++; All that stuff with $index seems to be an effort to avoid pushing an emply record into @marc. If that's really all you are trying to do then you could make it clearer. push @marc, [ @record ] if @record; You print "Next record....\n\n" but neither clear @record nor to a next. > } > elsif ($_ eq $marchead2) { next; } > else { > @line = (); > my $field = substr($_, 0, 5); > my $data = substr($_, 5); > push @line, [ $field, $data ]; > #print "Splitting line $field\t$data\n"; > next; > } > push @record, [ @line ]; > } > print "Closing file $_[0]...\n"; > close FILE; > return @marc; > > } No, that's really all totally confused. At a random shot-in-the-dark you were trying to do something like the following... (Since you didn't provide sample data this is just an untested wild guess). sub read_records { # read in whole MARC record and push it to @marc my ($filename) = @_; my (@marc,@record,@line); open my $file, '<', $filename or die qq(Cannot open file $filename: $!\n); print "Opening file $filename...\n"; local *_; while (<$file>) { chomp; if ($_ eq $marchead1) { push @record, [ @line ] if @line; push @marc, [ @record ] if @record; @line = @record = (); } elsif ($_ eq $marchead2) { push @record, [ @line ] if @line; @line = (); } else { my $field = substr($_, 0, 5); my $data = substr($_, 5); push @line, [ $field, $data ]; } } push @record, [ @line ] if @line; push @marc, [ @record ] if @record; print "Closing file $filename...\n"; return @marc; } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/