You open your file just inside the if, then read the entire file in the while loop. Then next time through the foreach $term(@inputs) { loop, there is nothing left to read so it exits the loop immediatly.

You have a few options:

  1. Reverse the while and foreach loops, so it loops through @inputs for each line read. or:
  2. Rewind the file after the while loop.
  3. If the file is small enough, read the entire thing into memory, and use a second foreach loop instead of the while

I don't know if it matters to you which order you get your matches, nor if the files are small enough, so I'm not sure which option would be better in this case.

Update: You might also want to reformat your code to make it easier to see where each block ends. Running your code through perltidy produces the following:

sub findtext { @filenumbers = @_; foreach $number (@filenumbers) { push @filenumbers2, split(/\W/, $number); } foreach $number (@numbers2) { chomp $number; if (defined $number) { open(FILE, "/home/jroberts/$number.txt") or die "$!"; foreach $term (@inputs) { while (<FILE>) if (/\b($term)\b/i) { push @before, split(' ', $`); @before = reverse(@before); @before = splice(@before, 0, 7); @before = reverse(@before); push @after, split(' ', $'); @after = splice(@after, 0, 7); if (exists $results{$number}) { $existing = $results{$number}; $results{$number} = $existing . "... @before" . "<b>$&</b>" . "@after ..."; } else { $results{$number} = "... @before" . "<b>$&</b>" . "@after "; } @before = undef; @after = undef; next; } else { print "No Match\n"; next; } } print "Match found in $number.txt\n"; @fulltext = $results{$number}; print "@fulltext\n"; close(FILE); } else { next; } next; } }

In reply to Re: Pattern Matching With Regular Expressions by Paladin
in thread Pattern Matching With Regular Expressions by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.