A long time ago, i suggested a rather drawn out way to
transform a 1-D array into a 2-D array: (jeffa) Re: Structure for nested html::template loops. It
uses autovivification to know which row to add the current
piece of data to. Upon showing this to one of my college
professors, he showed me a much simpler way to achieve the
same results in Python, using the
range
built-in function.
That function takes 3 args, the first two are the start and stop points ... and if we stop right there then this function is complete "word-candy", as the dot dot operator already does this. But, the 3rd argument is the 'step', which allows for some cool stuff:
This allows you to create a 2-D array from a 1-D array, 'folded' where ever you like. At the end, if there are no more element to stuff in the last row, the correct amount of 'undef' values will be pushed.use Data::Dumper; my $step = 5; my @array = ('a'..'z'); print Dumper [ map[ @array[$_..$_+$step-1] ], range(0,$#array,$step) ];
Now all we need is the ability to handle 'lazy lists' like Python's xrange. ;)
(and a big thanks to merlyn for reviewing this and improving it)UPDATE: ack ... rob_au already posted something similar: Stepping through an array. (he also points out Abigail-II's solution - no grep needed!)
# usage: my @AoA = range($start,$stop[,$step]); sub range {grep!(($_-$_[0])%($_[2]||1)),$_[0]..$_[1]}
Back to
Cool Uses for Perl