#!/Perl/bin/perl
package Test;
use strict;
use warnings;
use Perl6::Say;
use Data::Dumper qw/Dumper/;
sub new {
	my $class = shift;
	
	return bless({}, $class);
} # /new
sub run {
	my $self 		= shift;
=comment
	my $VAR1 = {'0' => [0,[[505,[[500,[[1],[2]]],[504,
[[3],[503,[[501,[[4],[5]]],[502,[[6],[507,[[7],[8]]]]]]]]]]],
[9]]],'500' => [500,[[1],[2]]],'501' => [501,[[4],[5]]],
'502' => [502,[[6],[507,[[7],[8]]]]],
'503' => [503,[[501,[[4],[5]]],[502,[[6],[507,[[7],[8]]]]]]],
'504' => [504,[[3],[503,[[501,[[4],[5]]],[502,[[6],[507,[[7],[8]]]]]]]]],
'505' => [505,[[500,[[1],[2]]],[504,[[3],[503,[[501,[[4],[5]]],
[502,[[6],[507,[[7],[8]]]]]]]]]]],'507' => [507,[[7],[8]]]};
=cut
	my $all_subtrees = {
		0 => [0, [[1], [2]]],
	};
	
	my $data = {
		0 => {node => 'EOS'},
		1 => {node => 'label', 	word => 'HELP'},
		2 => {node => '.$', 	word => '!'},
	};
	say Dumper $self->translate_subtrees($all_subtrees, $data);
}
=head2 translate_subtrees( $all_subtrees, $data )
e.g.
my $all_subtrees = {
	0 => [0, [[1],[2]]],
};
my $data = {
	0 => {node => 'EOS'},
	1 => {node => 'label', word => 'HELP'},
	2 => {node => 'label' => '.$', word => '!'},
};
result:
my $trans = {
	0 => ['EOS' [['label', 'HELP'], ['.$', '!']]]
};
=cut
sub translate_subtrees {
	my $self			= shift;
	my $all_subtrees	= shift;
	my $data			= shift;
	
	my %translated 		= ();
	
	while( my ($id, $subtree) = each %{$all_subtrees} ) {
		my $subtree_flat = $self->flatten_array($subtree);
		$subtree_flat =~ s/(.*[^0-9])([0-9])+([^0-9].*)/$1 ($2 >= 500 ? $data->{$2}->{node} : $data->{$2}->{node} . ' ' . $data->{$2}->{word} ) $3/g;
		$translated{$id} = $subtree_flat;
	}
	
	return \%translated;
} # /translate_subtrees
=head2 flatten_array( $array_ref )
=cut
sub flatten_array {
	my $self 	= shift;
	my $a_ref	= shift;
	
	$Data::Dumper::Indent = 0;
	my $flat 	= Dumper($a_ref);
	$Data::Dumper::Indent = 2; # reset2new
	
	return $flat;
} # /flatten_array
1;
use strict;
use warnings;
my $app = Test->new();
$app->run();