in reply to How can I print three lines before pattern match?

Try this...
#!/usr/bin/perl use strict; my @file = <DATA>; for my $i (0 .. $#file) { if ( $file[$i] =~ /pattern/ ) { print "$file[$_]" for ($i-3 .. $i-1); } } __DATA__ log info line yada yada 0 log info line yada yada 1 log info line yada yada 2 log info line yada yada 3 log info line (pattern) 4 log info line yada yada 5

Replies are listed 'Best First'.
Re^2: How can I print three lines before pattern match?
by ikegami (Patriarch) on Aug 14, 2009 at 02:50 UTC
    That doesn't work if the pattern is found in the first three lines. (And what's with the quotes around a variable?) Change
    print "$file[$_]" for ($i-3 .. $i-1);
    to
    print $file[$_] for grep $_ >= 0, $i-3 .. $i-1;
      Thanks ikegami. Those are good points.
Re^2: How can I print three lines before pattern match?
by neurotoxx (Novice) on Aug 14, 2009 at 02:34 UTC

    Not sure I understand this:

    for my $i (0 .. $#file)

    Is the #file a reference to my data file?

    So then, for my $i (0 .. $data.log)

    Thank you.

    Sorry for my ignorance.

      Is the #file a reference to my data file?

      No, not directly. Instead, the idea presented was to capture the whole file in @file:

      my @file = <DATA>;

      In your case, it would be <INFILE> instead of <DATA>. (<DATA> is a special file handle, starting after the special tag __DATA__ in the script, but otherwise pretty much a normal-behaving file handle.)

      The $# in front of an array identifier means "the last index of" that array.

      Perhaps better is to keep the last three lines in a fifo:

      open(INFILE, "< file.log") or die "Cant open file : $!"; open(OUT, "> results.txt") or die "Cant open new file : $!"; $pattern = "Error code 2"; my @file; while (<INFILE>) { print OUT @file if (/$pattern/ and @file); push @file, $_; # push on the current line shift @file while (@file > 3); # shorten to 3 elements } close INFILE; close OUT;

      Don't forget warnings and strict.

      -QM
      --
      Quantum Mechanics: The dreams stuff is made of

      $#file is the index of the last element in the array @file.