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

How can I grab all the text after the 3rd match eg: $data=.... afdhauio af ad a reason one reason two 1 2 3's reason for,reason7,reason8 ejroapjr.... I want all the stuff or at least 200 lines after the third occurance of "reason". i.e.reason for,reason7,reason8 ejroapjr.... $data is SLURPed What if I want all the stuff after the last occurance of "reason"? Can I still use sth like $data=~m/ /g or should I use /ismo? Thanks
  • Comment on Obtain all the lines after the 3rd occurrance of the match

Replies are listed 'Best First'.
Re: Obtain all the lines after the 3rd occurrance of the match
by davido (Cardinal) on May 21, 2011 at 06:57 UTC

    Introducing non-greedy quantifiers......

    use feature qw/say/; use strict; use warnings; my $string = "afdhauio af ad a reason one reason two 1 2 3's reason fo +r,reason7,reason8 ejroapjr"; $string =~ m/ (?:reason.*?){2} # Skip the first two reasons (reason.*) # Keep the third and all text after it. $ # To end of string. /x or die "No match.\n"; say $1;

    Note: You said you want all the stuff after the third occurrence of 'reason', yet in the example of the output you are seeking, you showed that you wanted to keep the third occurrence of 'reason' as well as everything that comes after it. There's a difference, and I had to choose which solution to create. I chose the one that matches your example output.


    Dave

Re: Obtain all the lines after the 3rd occurrance of the match
by ikegami (Patriarch) on May 21, 2011 at 08:14 UTC
    $data =~ /reason/g or die for 1..3; my ($rest) = $data =~ /.*/sg;
    my ($rest) = $data =~ /^(?:.*?reason){3}(.*)/s;
    (my $rest = $data) =~ s/^(?:.*?reason){3}//s; # Fails poorly
    my $rest = ( split /reason/, $data, 4 )[-1];
Re: Obtain all the lines after the 3rd occurrance of the match
by Anonymous Monk on May 21, 2011 at 06:08 UTC
    Can I still use sth like $data=~m/ /g or should I use /ismo? Thanks

    Try it out to see :)