in reply to NEXT statement in for loop

Please post code that actually works. Your code seems to be a snippet from a larger program, at least there is mention of @router and @routers, but only @router gets initialized.

It's hard what you actually expect as output - maybe you can rephrase your problem statement?

You seem to think that hashes or values %hash are ordered, but they are not. Maybe that is your problem?

Replies are listed 'Best First'.
Re^2: NEXT statement in for loop
by Anonymous Monk on Jun 05, 2016 at 16:49 UTC

    pasting the code again

    my @routers =$r[0]; my @router = ( "R0", "R2", "R3" ); my %fpc = ( R0 => { fpc1 => 5, fpc2 => 4, }, R2 => { fpc1 => 3, fpc2 => 2, }, R3 => { fpc1 => 1, fpc2 => 0, }, ); my %pic = ( R0 => { pic1 => 5, pic2 => 4, }, R2 => { pic1 => 3, pic2 => 2, }, R3 => { pic1 => 1, pic2 => 0, }, ); @router = ( "R0", "R2", "R3" ); for my $rh (@routers) { my $r = shift(@router); print "value of r is $r\n"; OUTER: for my $f (values %{ $fpc{$r} }) { INNER: for my $p (values %{ $pic{$r} }) { print "request chassis pic offline fpc-slot $f pic-slot $p +\n"; next OUTER; } } }

    Yes, values in hash are not ordered as expected

      I'm not clear whether your question has been answered yet. To further clarify your code, I've reindented it and added some more diagnostics that show the order that values will take for a given hash:

      #!perl -w use strict; use Data::Dumper; my @r = ('R0'); my @routers =$r[0]; my @router = ( "R0", "R2", "R3" ); my %fpc = ( R0 => { fpc1 => 5, fpc2 => 4, }, R2 => { fpc1 => 3, fpc2 => 2, }, R3 => { fpc1 => 1, fpc2 => 0, }, ); my %pic = ( R0 => { pic1 => 5, pic2 => 4, }, R2 => { pic1 => 3, pic2 => 2, }, R3 => { pic1 => 1, pic2 => 0, }, ); @router = ( "R0", "R2", "R3" ); for my $rh (@routers) { my $r = shift(@router); print "value of r is $r\n"; print "Processing routers in order " . join(",", values %{ $fp +c{$r} }), "\n"; OUTER: for my $f (values %{ $fpc{$r} }) { print "Processing pic-elements for $r in order " . join( " +,", values %{ $pic{$r} }), "\n"; INNER: for my $p (values %{ $pic{$r} }) { print "request chassis pic offline fpc-slot $f pic-slo +t $p\n"; next OUTER; } } }

      Note that between runs of the program, the order can change for every hash. The best way to work with this is to save the order you want in a separate list:

      c:\Users\Corion\Projekte>perl -w tmp.pl value of r is R0 Processing routers in order 5,4 Processing pic-elements for R0 in order 5,4 request chassis pic offline fpc-slot 5 pic-slot 5 Processing pic-elements for R0 in order 5,4 request chassis pic offline fpc-slot 4 pic-slot 5 c:\Users\Corion\Projekte>perl -w tmp.pl value of r is R0 Processing routers in order 5,4 Processing pic-elements for R0 in order 4,5 request chassis pic offline fpc-slot 5 pic-slot 4 Processing pic-elements for R0 in order 4,5 request chassis pic offline fpc-slot 4 pic-slot 4 c:\Users\Corion\Projekte>perl -w tmp.pl value of r is R0 Processing routers in order 5,4 Processing pic-elements for R0 in order 4,5 request chassis pic offline fpc-slot 5 pic-slot 4 Processing pic-elements for R0 in order 4,5 request chassis pic offline fpc-slot 4 pic-slot 4 c:\Users\Corion\Projekte>perl -w tmp.pl value of r is R0 Processing routers in order 5,4 Processing pic-elements for R0 in order 5,4 request chassis pic offline fpc-slot 5 pic-slot 5 Processing pic-elements for R0 in order 5,4 request chassis pic offline fpc-slot 4 pic-slot 5

      In your case, I would save the list of numbers like the following:

      my @items = values ${ $fpc{$r} }; for my $f (@values) { ... }

      If the order of the values is important and the keys not then maybe use a hash of arrays (HoA)

      #!perl use strict; my @routers = ( "R0", "R2", "R3" ); my %fpc = ( R0 => [5,4], R2 => [3,2], R3 => [1,0], ); my %pic = ( R0 => [5,4], R2 => [3,2], R3 => [1,0], ); for my $r (@routers) { print "value of r is $r\n"; for my $f (@{ $fpc{$r} }) { for my $p (@{ $pic{$r} }) { print "request chassis pic offline fpc-slot $f pic-slot $p\n"; } } }
      poj