Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re: multiple local vars in a foreach loop

by LanX (Cardinal)
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 the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (4)
As of 2020-09-26 16:32 GMT
Find Nodes?
    Voting Booth?
    If at first I donít succeed, I Ö

    Results (141 votes). Check out past polls.