in reply to Re: getting a return code from a looping regular expression
in thread getting a return code from a looping regular expression

while s/[(][^()][)]//; is actually a syntax error. Also, that pattern only matches parenthesis with exactly one character between them.

Here's some working code for arbitrary parenthesized strings:

sub balanced { $_ = shift; while (s/[(][^()]*[)]//) {}; return 0 if /[()]/; return 1; }

Of course a real programmer uses a PDA to balance parenthesis. (;

sub balanced { my $string = shift; my $stack = 0; for my $index (0..length($string) - 1) { my $char = substr($string, $index, 1); if ($char eq '(') { $stack++; } elsif ($char eq ')') { $stack--; }
                # Update: Ha!  Thanks, BlaisePascal.
                # A PDA that happily pops an empty
                # stack isn't very useful. :)
return 0 if $stack < 0; } return $stack ? 0 : 1; }

-Matt

Replies are listed 'Best First'.
RE: RE: Re: getting a return code from a looping regular expression
by BlaisePascal (Monk) on Aug 01, 2000 at 22:57 UTC
    True, PDA's are the proper tool for balancing parenthesis. But it helps if it works... Your PDA would match "))((" perfectly find. Most wouldn't consider that balanced...
    sub balanced { my $string = shift; my $stack = 0; @string = split //, $string; for (@string) { last if $stack < 0; $stack++ if /[(]/; $stack-- if /[)]/; } return $stack ? 0 : 1; }
    or, without using split and //:
    sub balanced { my $string = shift; my $stack = 0; for my $i (0..length($string)-1) { last if $stack < 0; $stack++ if substr($string,$i,1) eq '('; $stack-- if substr($string,$i,1) eq ')'; } return $stack ?0 : 1; }