Приглашаем посетить
PHP (php.find-info.ru)

Section 12.14.  Capturing Parentheses

Previous
Table of Contents
Next

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.

    Previous
    Table of Contents
    Next