for ( '<1>', # want match '<<2>>', # want match '<<3>', # want fail '<<<4>>', # want fail '<<5>>>>', # want fail ){ use vars qw' $LEN '; print "$_\n"; print " $_\n" for m( (?<+)(?{ $LEN = length $^N; }) ( [^><]* ) (?(?{ $LEN > 0 })(??{ '>' x $LEN })) (?! > ) # no following > )x; print " LEN = $LEN\n"; } __END__ <1> LEN = 0 <<2>> LEN = 0 <<3> LEN = 0 <<<4>> LEN = 0 <<5>>>> LEN = 0