package WhiteMouse; use strict; use warnings; use constant DEFAULT_OBJECT_ARRAY_VAL => [ 0 ]; sub new { my $self = bless { %{$_[1]} }, ref($_[0]) || $_[0]; $self->init; $self } sub get { $_[0]->{$_[1]} } sub set { $_[0]->{$_[1]} = $_[2] } sub init { my $self = shift; my $ra_dim = $self->get('object_array_dim'); my $ra_val = $self->get('object_array_val') || DEFAULT_OBJECT_ARRAY_VAL; my $use_single_value = ! $#{$ra_val}; my $ra_obj = []; my $ra_p = $ra_obj; my @todo = (); my $dim_l = $#{$ra_dim}; for (my $i = 0; $i <= $dim_l; ++$i) { @{$ra_p}[0 .. $ra_dim->[$i] - 1] = map {[]} (1 .. $ra_dim->[$i]) unless $i == $dim_l; for (my $j = 0; $j < $ra_dim->[$i]; ++$j) { if ($i == $dim_l) { $ra_p->[$j] = $use_single_value ? $ra_val->[0] : shift(@$ra_val) || DEFAULT_OBJECT_ARRAY_VAL; } else { push @todo, [$ra_p->[$j], $i]; } } ($ra_p, $i) = @{shift @todo} if @todo; } $self->set(object_array => $ra_obj); } #### next if $i == $dim_l && @todo; #### ($ra_p, $i) = @{shift @todo} if @todo; #### #### use strict; use warnings; use Data::Dumper; my $ra_dim = [ qw( 2 2 ) ]; my $ra_val = [ qw( A B C D E F G H I J K L) ]; print 'DIM: ', "@$ra_dim\n"; print 'VAL: ', "@$ra_val\n"; my $ro_pandim1 = WhiteMouse->new({ object_array_dim => $ra_dim, object_array_val => $ra_val, }); my $ro_pandim2 = WhiteMouse->new({ object_array_dim => $ra_dim, object_array_val => [ 'XXXX' ], }); my $ro_pandim3 = WhiteMouse->new({ object_array_dim => $ra_dim, }); print "=======================================\n"; print Dumper $ro_pandim1->get('object_array'); print Dumper $ro_pandim2->get('object_array'); print Dumper $ro_pandim3->get('object_array'); print "=======================================\n";