Honestly, I did think of doing it that way, but considered it rather too repetitive. The problem is there are conditions under which you want to change the depth for your next state — but a separate issue is whether you want to change depth before processing the current state. That's why the code ends up so messy.
The following doesn't get rid of the variable, but rather repurposes and renames it to separate the two distinct decisions involved more cleanly.
{ my( $indent, $depth ) = ( "\t", 0 ); sub pp { my $next_depth; my( $end_chunk, $first ) = f1( $str ); if( defined $first ) { if( $first eq CONST1 ) { ++$end_chunk; $next_depth = --$depth; } elsif( defined my $pos2 = f2( $str, $first ) ) { $next_depth = $depth; $end_chunk = $pos2 + 2; } else { $next_depth = $depth + 1; } } else { $next_depth = $depth; } print $indent x $depth, substr( $str, 0, $end_chunk ); $str =~ s[^.{$end_chunk}\s*][]; $depth = $new_depth; return; } }
I still think your code is doing a lot of manual pattern matching which could be better done by the regex engine.
Makeshifts last the longest.
In reply to Re^3: Refactoring challenge.
by Aristotle
in thread Refactoring challenge.
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |