Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: Looping Over Hash Skips an Element?

by toolic (Bishop)
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 making s'mores by the fire in the courtyard of the Monastery: (14)
As of 2015-07-02 08:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (31 votes), past polls