Beefy Boxes and Bandwidth Generously Provided by pair Networks Bob
No such thing as a small change
 
PerlMonks  

Re: Looping Over Hash Skips an Element?

by toolic (Chancellor)
on Jan 06, 2012 at 17:47 UTC ( #946637=note: print w/ replies, xml ) Need Help??


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"; }


Comment on Re: Looping Over Hash Skips an Element?
Select or Download Code
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)

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (4)
As of 2014-04-20 21:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (488 votes), past polls