You push $1 onto @array (push (@array, $1);) regardless of getting a match in the previous regex. Unless the last matching line in your file is a well formed $lastPhrase line, your code as it stands will fail as you have noted.
The following test code illustrates the problem:
use strict; use warnings; use List::Util qw{first}; my $file = <<FILE; total rejected recors: 10 FILE my @phrases = ( "total rejected rows:", "total rejected recors:", "rejectb:", "total rejected rows:" ); open my $inFile, '<', \$file; my @newarray = search_phrase ($inFile, @phrases); close $inFile or die qq{close: $!\n}; $newarray[$#newarray] =~ s/\s+//g; if (@newarray && $newarray[$#newarray] > 0) { print "$newarray[$#newarray]\n"; } else { print "-1\n"; } sub search_phrase { my ($inFile, @phrases) = @_; my @array; my $lastPhrase = $phrases[-1]; my @lines = <$inFile>; foreach my $phrase (@phrases) { # Find the first match in the remaining lines for the current +phrase my $lineNo = first { $lines[$_] =~ /\Q$phrase\E/ } 0 .. $#line +s; next unless defined $lineNo; # No line containing current phra +se print "Found: $lines[$lineNo]" if ($lines[$lineNo] =~ m{\Q$lastPhrase\E\s*(\d+)}); push (@array, $1); $lineNo++; splice @lines, 0, $lineNo; # Delete processed lines } return @array; }
In reply to Re: uninitialized value error
by GrandFather
in thread uninitialized value error
by mercuryshipz
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |