12.14. Capturing Parentheses
Use capturing parentheses only when you intend to capture . It's a waste of processor cycles to capture a substring you don't need. More importantly, it's misleading to do so. When the unfortunates who have to maintain the following code see: if ( $cmd =~ m/\A (q | quit | bye | exit) \n? \z/xms ) { perform_cleanup( ); exit; } they will almost certainly start casting around to determine where $1 is used (perhaps for an exit confirmation request, or inside perform_cleanup( )).They'll be rightly annoyed when they eventually discover that $1 isn't used anywhere. Because now they can't be sure whether that indicates a bug, or was just laziness on the part of the original coder. Hence, they'll probably have to re-examine the logic of perform_cleanup( ) to determine whether that unused capture is actually A.W.O.L. And that's a waste of maintainer cycles.Perl provides a form of regex parentheses that deliberately don't capture: the (?:...) parentheses. If the previous example had been written: if ( $cmd =~ m/\A (?:q | quit | bye | exit) \n? \z/xms ) { perform_cleanup( ); exit; } then there would be no doubt that the parentheses were being used simply to group the four alternative "exit" commands, rather than to capture the particular "exit" command used.Use non-capturing parentheses by default, and reserve capturing parentheses for when you need to make use of some part of a matched string. That way, your coded instructions will also encode your intentions, which is a much more robust and effective style of programming. |