http://www.perlmonks.org?node_id=946637


in reply to Looping Over Hash Skips an Element?

If you want the 9th to show up in your output, you need to print it:
foreach my $key ( keys %ifSpeeds ) { if ($counter <= 8) { print "$key "; $counter++; } else { print "$key\n"; # <-------------- $counter = 1; } }
Update: List::MoreUtils can also be used for this:
use List::MoreUtils qw(natatime); my $it = natatime(9, (keys %ifSpeeds)); while (my @vals = $it->()) { print "@vals\n"; }

Replies are listed 'Best First'.
Re^2: Looping Over Hash Skips an Element?
by mmartin (Monk) on Jan 06, 2012 at 18:11 UTC
    Hey toolic, thanks for the reply.

    Duhh haha... I guess I had a brain fart on that one..! lol thanks.

    I was just using the printing as an example. What I'm reallying trying to do is to add 8 consecutive values from the hash and place that summed value in an array.

    Using the same hash, would this be what I should do?
    my @sum_values; my $x = 0; foreach my $key ( keys %ifSpeeds ) { if ($counter <= 8) { $sum_values[$x] += $ifSpeeds{ $key }; $counter++; } else { $x++; $sum_values[$x] = $ifSpeeds{ $key }; $counter = 1; } } for (my $x = 0; $x <= $#sum_values; $x++) { print "$x) $sum_values\n"; }

    The final result (given the hash with 32 elements) would be that the array would contains 4 values, which include the following:
    [0] --> (sum of Gi3/1 to Gi3/8) [1] --> (sum of Gi3/9 to Gi3/16) [2] --> (sum of Gi3/17 to Gi3/24) [3] --> (sum of Gi3/25 to Gi3/32)
    Does all that look correct to you?


    Thanks Again,
    Matt


      How about:
      use List::MoreUtils qw(natatime); use List::Util qw(sum); use Data::Dumper; my @sums; my $it = natatime(8, (values %ifSpeeds)); while (my @vals = $it->()) { push @sums, sum(@vals); } print Dumper(\@sums); __END__ $VAR1 = [ '6200000000', '6200000000', '6200000000', '2600000000' ];
      if ($counter <= 8) { $sum_values[$x] += $ifSpeeds{ $key }; $counter++; } else { $x++; $sum_values[$x] = $ifSpeeds{ $key }; $counter = 1; }

      To avoid the almost-duplication of the key statement, you could also write

      $sum_values[$x] += $ifSpeeds{ $key }; $x++ unless ++$counter % 8;

      or even simply

      $sum_values[$counter++/8] += $ifSpeeds{ $key }; # the [] impli +es int(...)

      (Perl does not generate a warning when you do something like $sum += ..., with $sum being undef initially — it treats it as 0)