http://qs321.pair.com?node_id=308257

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

All occurances of XXX should be followed by 0 or more blank spaces, 1 or more newline, and then YYY

Replies are listed 'Best First'.
Re: how do I check for this rule
by moxliukas (Curate) on Nov 19, 2003 at 10:14 UTC
    /XXX\s*\n+YYY/sg;

    UPDATE: I have misread the question first and thought that the monk wanted to find all occurances rather than validate them. Please read the answer that Roger provided below. That's what English being not the first language does for you -- my mistake.

      Hang on, not so fast. ;-)

      Your regular expression will only find matching occurances of XXX ... YYY, *NOT* to validate all occurances.

      To validate a sequence, you will have to make sure there is no mismatches of XXX, and hence require a bit more work.

      use strict; my $data; { local $/; $data = <DATA>; } # number of times didn't match XXX ... YYY # is total number of XXX minus the XXX ... YYY # pattern appears. my $non_match = $#{[$data =~ /(XXX)/gs]} - $#{[$data =~ /(XXX\s*\n+YYY)/gs]}; print !$non_match ? "All sequences of XXX - YYY are ok\n" : "$non_match bad sequences found\n"; __DATA__ XXX YYY XXX ZZZ XXXYYY
        Or just:
        $str !~ /XXX(?!\s*\n+YYY)/;

        Abigail