in reply to How to get the key - value names from a hash
To help figure things out, I very strongly recommend you clean up your code - you've got some stray indentation, a whole bunch of unused variables and ones irrelevant to the question (Update: and lots of whitespace), and in a few cases the order of statements is a bit confusing (e.g. defining $odd and $even in between the use of $column_count). Also, lines 61 and 81 are not producing the warning, as you said. Fixing these things will help people who are trying to help you.
Second, see the Basic debugging checklist, in this case the fourth point: use Data::Dumper or Data::Dump to look at your data structures. I've taken the liberty of doing all the above for you:
#!/usr/bin/env perl use strict; use warnings; use Data::Dump; my @items = (2,14,7,17,1,12,3,4,11,5,13,6,8,10,9,16,15,18); @items = map { sprintf '%02u', $_ } @items; dd @items; @items = sort @items; dd @items; my ($odd,$even)=(0,0); $_ % 2 ? $odd++ : $even++ for @items; print "Odd = $odd, Even = $even\n"; my %odd_even; $odd_even{"$odd $even"}++; dd \%odd_even; # { "9 9" => 1 } dd $odd_even{0}; # undef my $sum; $sum += $_ for @items; my $avg = $sum / @items; $avg = ($avg - int($avg)) >= 0.5 ? int($avg) + 1 : int($avg); my %average; $average{$avg}++; dd \%average; # { 10 => 1 } dd $average{0}; # undef
So the reason you're getting that warning is because each of your hashes have only one key, each of which is not "0". If you want to iterate over a hash, see keys, values, and each. Personally, my code for iterating over a hash typically looks something like this:
for my $key (sort keys %hash) { my $value = $hash{$key}; }
Note that while your method of doing a numeric sort may work in this case, it will break on 3-digit and longer numbers. A numeric sort in Perl is written as: sort {$a<=>$b} @array.
Also, a nitpick: using map only for its side effects can be a little confusing, so I've changed it to a for loop instead.
Update 2: Note that ($avg - int($avg)) >= 0.5 ? int($avg) + 1 : int($avg) can also be written as: use POSIX 'lround'; $avg = lround($avg);
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: How to get the key - value names from a hash
by Scotmonk (Sexton) on Nov 29, 2019 at 22:56 UTC | |
by davido (Cardinal) on Nov 30, 2019 at 01:20 UTC | |
by Scotmonk (Sexton) on Nov 30, 2019 at 11:17 UTC | |
by Anonymous Monk on Dec 06, 2019 at 01:55 UTC | |
by haukex (Archbishop) on Nov 30, 2019 at 09:57 UTC | |
by Scotmonk (Sexton) on Dec 03, 2019 at 13:19 UTC | |
|
Re^2: How to get the key - value names from a hash
by Scotmonk (Sexton) on Dec 03, 2019 at 12:47 UTC | |
by hippo (Archbishop) on Dec 03, 2019 at 13:35 UTC |