use strict; use warnings; while ( ) { /(^foo.*bar$)(?{print "BOTH FOUND: $_"}) | (^foo) (?{print "FOO FOUND: $_"}) | (bar$) (?{print "BAR FOUND: $_"})/x } __DATA__ foo baz foo bar bar fu bar fuz foo on you bar