#!/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; }