#!/usr/bin/perl -w

# El objetivo es hacer una subrutina que equivalga a un for(;;)
# loop, devuelva una lista de las iteraciones, y llame a otro loop
# sucesivamente hasta que se llegue a la dimensión de la primera 
# llamada y se pare. El fin último es poder hacer algo multidimensional,
# como una cuadrícula, sin tener que escribir todos los for loops.

use 5.032;

# use Data::Printer;

my $dimensions = 11_000;
my @init = (0) x ($dimensions+1);
my @end = (1) x ($dimensions+1);
my @step = (0.1) x ($dimensions+1);

my $t = time();

my $results = loops(0);   # begin in 0

my %h;
for my $dim (@$results){
    my %out;
    while (my ($k,$v) = each %$dim){
	$out{$v}{$k} = $v;
	print "$out{$v}{$k} ";
    }
    say "";     #   p %out;
}
say "Time elapsed ", time()-$t, " secs.";

say "Comprobación:";
for my $i (0..$dimensions-1){
    for (my $j=0; $j<=1; $j+=0.1){
	say "$i $j $h{$i}{$j}";
    }
}


exit 1;


sub loops {
    my ($d) = shift;
    state @r;
    for (my $i = $init[$d]; $i <= $end[$d]; $i += $step[$d]) {
	$r[$d]{$i} = $i;
	$h{$d}{$i}++;
    }
    if (++$d < $dimensions){
	loops($d);
    }
    return \@r;
}

