#!/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, $_ ); } } } }