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

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.

  • Comment on Re^2: How can I print three lines before pattern match?

Replies are listed 'Best First'.
Re^3: How can I print three lines before pattern match?
by QM (Parson) on Aug 14, 2009 at 03:02 UTC
    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

Re^3: How can I print three lines before pattern match?
by ikegami (Patriarch) on Aug 14, 2009 at 02:48 UTC
    $#file is the index of the last element in the array @file.