{ my ($indent, $depth) = ( "\t", 0 ); my $_print = sub { print $indent x $depth, substr( $_[0], 0, $_[1] ); }; sub pp { return unless @_; my ($str) = @_; my ($pos, $first ) = f1( $str ); if ( defined $first ) { if ( $first eq CONST1 ) { $depth++; $_print->( $str, ++$pos ); } elsif ( defined( my $newpos = f2( $str, $first ) ) ) { $_print->( $str, $newpos + 2 ); } else { $_print->( $str, $pos ); $depth++; } } else { $_print->( $str, $pos ); } $str =~ s[^.{$pos1}\s*][]; return $str; } } #### { my ($indent, $depth) = ( "\t", 0 ); my $_print = sub { print $indent x $depth, substr( $_[0], 0, $_[1] ); }; my $_call_f1_f2 = sub { my $str = shift; my ($pos, $first) = f1( $str ); return ($pos, 0) if !defined $first; if ( $first eq CONST1 ) { $depth--; return ($pos + 1, 0); } $pos = f2( $str, $first ); return ($newpos + 2, 0) if defined $pos; return ($pos, 1); }; sub pp { return unless @_; my ($str) = @_; my ($pos, $depth_mod) = $_call_f1_f2->( $str ); $_print->( $str, $pos ); $depth += $depth_mod; $str =~ s[^.{$pos1}\s*][]; return $str; } }