in reply to Matching against $_ behaves differently than matching against a named scalar?

A possible way to overcome it without using a lexical variable inside a loop: to make a successful match to reset $1, $2...
/^([^ ]+) ([^ ]+)/ or /(*ACCEPT)/; # or /(?=)/; print "$1 $2" . "\n" if $1 && $2;
Also, it is possible to 'control flow', being inside regex:
/^([^ ]+) ([^ ]+)(?{ print "$1 $2" . "\n" })/;
That way of using regex (with (?{ <code> }) construct) is useful for debugging.