in reply to Re^3: Refactoring challenge.
in thread Refactoring challenge.

I still think your code is doing a lot of manual pattern matching which could be better done by the regex engine.

By that, I assume you mean the indexBal() routine.

If you can encapsulate this into a more efficient, or more simple routine by using the regex engine, please do, it would help me a lot. I tried and failed.

sub indexBal { my( $string, $lookFor, $limit ) = @_; my $nesting = 0; for( my( $position, $char ) = ( 0, substr $string, 0, 1 ); $position < min( length( $string ) , $limit ); $char = substr $string, ++$position, 1 ) { $nesting++ if $char =~ m/[\[\{]/; $nesting-- if $char =~ m/[\]\}]/; die 'Unbalanced' if $nesting < 0; return $position if $char eq $lookFor and $nesting == 0 } return; } my $s = '{ [ { [ { x }, { y } ], [ z ] } ] } { [ { '; my $pos = indexBal $s, '}', length( $s ); print substr $s, 0, $pos+1; { [ { [ { x }, { y } ], [ z ] } ] }

Note that:

  • The brackets and braces may be nested to any arbitrary depth.
  • The requested match may not yet be available.
  • There will nearly always be an incomplete set of nested brackets on the end of the string.
  • The routine takes a parameter that specifies the maximum length in which the match must be found else don't bother looking any further.

    Examine what is said, not who speaks.
    Silence betokens consent.
    Love the truth but pardon error.
  • Replies are listed 'Best First'.
    Re^5: Refactoring challenge.
    by tphyahoo (Vicar) on Mar 08, 2005 at 09:26 UTC
      From browsing PM, seems like you a good place to be using Text::Balanced or maybe Parse::Recdesent. Unfortunately I'm still learning how to do this myself, so I can't help with the code.
        a good place to be using Text::Balanced or maybe Parse::Recdesent.

        Not really. You see, besides that they will only really work on a complete strings, not a partial string as here, they are so slow in use, cumbersome to learn to use, and so difficult to debug with, that I wouldn't recommend them to anyone, never mind use them myself.


        Examine what is said, not who speaks.
        Silence betokens consent.
        Love the truth but pardon error.