Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

Re: multiple local vars in a foreach loop

by LanX (Bishop)
on Jan 31, 2013 at 08:40 UTC ( #1016253=note: print w/replies, xml ) Need Help??

in reply to multiple local vars in a foreach loop

The simple answer

my %hash=@keys;

already does what you want. =)


The long answer!

Regarding your initial question: "unfortunately not"!

Perl5 doesn't provide a built-in way to have multiple loop vars in foreach.

There are several workarounds with while loops:

  • destructive with splice or multiple shifts

  • iterator with List::MoreUtils::natatime() or pairwise()

  • classic with c-stile for with two index-increments per iteration

but these workarounds have been discussed so often in the monastery that I'd prefer to link them after finding them.


In this case (ignoring the solution on top) I would do something with splice:

DB<113> @array = (a =>1,b=>2) => ("a", 1, "b", 2) DB<114> while ( my ($key,$val) = splice(@array,0,2) ) { $hash{$key}=$val; } DB<115> \%hash => { a => 1, b => 2 } DB<116> \@array # emptied! => []

You need to copy @array in case I wanna keep the initial elements after the loop.

Older discussions

googling the monastery for splice+natatime

Cheers Rolf


Originally I proposed this code

while(@array) { $hash{shift @array} = shift @array; }

But I was bitten by precedence, the code does it the wrong way around:

DB<108> @array = ( a => 1, b => 2 ) => ("a", 1, "b", 2) DB<109> $hash{shift @array} =shift @array while @array DB<110> \%hash => { 1 => "a", 2 => "b" }

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1016253]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (11)
As of 2018-06-22 10:18 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (124 votes). Check out past polls.