learningperl01 has asked for the wisdom of the Perl Monks concerning the following question:

Hello everyone, I am hoping someone can please shed some light/point me in the right direction. I am trying to figure out how to search for the 1st occurrences of two strings and once they are found print all previous data.

The reason that I am looking for 1st occurrences of Subject followed by Content is that Content will sometimes show up in several places, but I only want to PRINT all data from the 1st Content: after the 1st Subject: match.

Below is some sample data which I would be working with, any pointers etc would be greatly appreciated.

Right now what I am doing is having to run matches on each line that I want to match and print on.

SAMPLE FILE DATA:

Sender: 123 Recipient: aaa Date: 2009/03/04 Content: data0039 Time: 08:20:01 Operator: test Subject: test01 Content: data data Subject: RE: test Content: data2 data Additional: additional data

OUTPUT THAT I'M TRYING TO GET

So I want to find the First Occurrence of Subject: following by the first occurrence of Content: and print everything prior to the Content: match.

Sender: 123 Recipient: aaa Date: 2009/03/04 Content: data0039 Time: 08:20:01 Operator: test Subject: test01

Replies are listed 'Best First'.
Re: Print data after to 1st occurrence matches
by jwkrahn (Abbot) on Sep 23, 2009 at 14:12 UTC
    $ echo " Sender: 123 Recipient: aaa Date: 2009/03/04 Content: data0039 Time: 08:20:01 Operator: test Subject: test01 Content: data data Subject: RE: test Content: data2 data Additional: additional data " | perl -ne' if ( 1 .. $content && /^Subject/ ) { $content += /^Content/; print; } ' Sender: 123 Recipient: aaa Date: 2009/03/04 Content: data0039 Time: 08:20:01 Operator: test Subject: test01
Re: Print data after to 1st occurrence matches
by BioLion (Curate) on Sep 23, 2009 at 14:32 UTC

    Can you show us what you have so far?

    I would probably read the file one line at a time, saving them as I go, and when you match what you want, print out what you have already seen (pretty much exactly as OP describes...) :

    use warnings; use strict; open (my $fh, '<', 'test.txt') || die "Failed to open test input : $!" +; my $contents = ''; my $previous = 'Not set'; my $pass = 0; while (<$fh>){ my $line = $_; if ( $line =~ /^Content:/ && $previous =~ /^Subject:/ ){ ## if we matched the previous line as a 'Subject' line ## and this line is a 'Content' line print $contents; $pass = 1; last; } ## append current line and set previous line $contents .= $line; $previous = $line; } print "No match found.\n" unless $pass; close $fh || die "Failed to close test file : $!";

    I know this is verbose, but KISS works well for me...

    learningperl01 you described in words pretty much exactly as I have done, and broke the problem down into the component parts well, so maybe have a go next time! If you are having problems with regexes, then check out perlre

    Update: Disclaimer! Code not tested!

    Just a something something...