Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: multiple local vars in a foreach loop

by LanX (Saint)
on Jan 31, 2013 at 08:40 UTC ( [id://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. =)

UPDATES

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.

Splice

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

Errata

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?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1016253]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2024-03-29 15:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found