#!/usr/bin/perl # recurse.pl -- Aid to Parse::RecDescent builders use warnings; use diagnostics; use Data::Dumper; my @data = ( 'level0', ['level1','(',['level2',['level3','line1','line2','line3']]] ); print Dumper @data,"\n"; recurse (\@data); sub recurse { my $tree = shift; my $indent = shift; my $level_count = shift; my $count = 0; unless ( defined($indent) ) { $indent = 0; } unless ( defined($level_count) ) { $level_count = ""; } foreach (@$tree) { if ( ref eq 'ARRAY' ) { printf( "%40s |%s[\n", sprintf( "%s%s", $level_count, $count ), '.' x $indent ); recurse( $_, $indent + 2, $level_count . "$count." ); $count++; printf( "%40s |%s]\n", " ", '.' x $indent ); } else { if ( !defined($_) ) { printf( "%40s |%s%s\n", sprintf( "%s%s", $level_count, $count++ ), '.' x $indent, "!Undefined!" ); } elsif ( $_ eq "" ) { printf( "%40s |%s%s\n", sprintf( "%s%s", $level_count, $count++ ), '.' x $indent, "!NULL!" ); } elsif ( $_ eq "\n" ) { printf( "%40s |%s%s\n", sprintf( "%s%s", $level_count, $count++ ), '.' x $indent, '\\n' ); } else { printf( "%40s |%s%s\n", sprintf( "%s%s", $level_count, $count++ ), '.' x $indent, $_ ); } } } } #### $>recurse $VAR1 = 'level0'; $VAR2 = [ 'level1', '(', [ 'level2', [ 'level3', 'line1', 'line2', 'line3' ] ] ]; $VAR3 = ' '; 0 |level0 1 |[ 1.0 |..level1 1.1 |..( 1.2 |..[ 1.2.0 |....level2 1.2.1 |....[ 1.2.1.0 |......level3 1.2.1.1 |......line1 1.2.1.2 |......line2 1.2.1.3 |......line3 |....] |..] |]