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 |