Here's another "What's a quick and real neat way of...." type question
Piers Harding
piers at ompa.net
Thu Nov 14 23:33:24 CST 2002
Excellent - I wondered if there was atrap in it, because I just rattled
it off the top of my so to speak.
Cool.
On Fri, Nov 15, 2002 at 09:40:56AM +1300, Grant McLean wrote:
> Piers Harding wrote:
> > On Thu, Nov 14, 2002 at 11:06:14PM +1300, Enkidu wrote:
> > > Is there a neat way of looping through *both arrays* at
> > > the same time?
> >
> > how about this:
> >
> > while (my ($a, $b) = (shift @a, shift @b)){
> >
> > do the funky thing with $a and $b ....
> >
> > }
>
> Interesting suggestion, I wouldn't have expected that to
> work, since when @a and @b are empty, the right hand
> side of the expression (shift @a, shift @b) evaluates to
> (undef, undef) which is a two element list which in boolean
> terms is 'true', so the while loop should never exit.
>
> My curiosity was piqued, so I tried it. The bad news is it
> doesn't work :-( The good news is I was right ;-/
>
> One approach is to add a line to explicitly break out of
> the loop when the arrays are empty:
>
> while (my ($a, $b) = (shift @a, shift @b)){
> # do the funky thing with $a and $b ....
> last unless(@a);
> }
>
> At first, I made the mistake of adding this check as the
> first line of the loop. This meant the loop skipped the
> last element of each array since when the last element was
> successfully shifted off, there was nothing left in the
> array. So, the test needs to go either at the end of the
> loop. (I also tried putting it in a continue block but it
> didn't work - I guess 'last' won't break out of the main
> block when you call it from another block).
>
> It is possible to combine the test with the assignment in
> such a way that the right hand side evaluates to an empty
> list when the arrays are empty:
>
> while(my($a, $b) = (@a ? (shift @a, shift @b) : ()) ){
> # do the funky thing with $a and $b ....
> }
>
> Anyone have a more elegant solution?
>
> Grant
>
> PS: I'm assuming @a and @b are the same length.
>
>
>
> ===============================================================
> Grant McLean BearingPoint Inc - formerly The Web Limited
> +64 4 495 9026 Level 6, 20 Customhouse Quay, Box 1195
> gmclean at bearingpoint.biz Wellington, New Zealand
>
More information about the Wellington-pm
mailing list