in reply to Sort hash with values
I think that I see the problem. Ordinarily, you would be able to iterate over something like foreach ( sort keys(%IP_store) ) ..., but IP-address strings of varying lengths won’t sort correctly as strings.
The sort verb does allow for a subroutine to be specified, which must return a value that is less than, equal or greater than zero as appropriate, so we do have the mechanism by which to sort the strings the way we want: as a left-to-right hierarchical collection of four integers. So, let’s define a separate sub to do this ... something along these (untested) lines:
# 'sort' COMPARISON FUNCTION FOR IP-ADDRESSES. sub ip_compare { # GRAB THE TWO ARGUMENTS PASSED BY 'SORT' my ($a, $b) = @_; # SPLIT THE IP-ADDRESSES INTO FOUR =STRINGS= BY # THE PERIOD CHARACTER. my ($a1, $a2, $a3, $a4) = split('\.', @$a); my ($b1, $b2, $b3, $b4) = split('\.', @$b); # TYPECAST EACH COMPONENT AS INTEGERS, THEN # USE INTEGER '<=>' OPERATOR TO COMPARE NUMBERS. # USE A STACK OF SHORT-CIRCUIT '||' OPS WHICH WILL # STOP AT (AND RETURN) THE FIRST NON-ZERO RESULT # IN THE CHAIN. return (int($a1) <=> int($b1)) || (int($a2) <=> int($b2)) || (int($a3) <=> int($b3)) || (int($a4) <=> int($b4)); }
And I would put that subroutine (when debugged), with its comments, into my program. There are many ways to write it: this one is reasonably clear.
Now we can do something like sort (ip_compare, keys(%ip_addr)), or something like that, and it should work. You iterate over the returned list of keys and retrieve the values from the hash by key.
Replies are listed 'Best First'. | |
---|---|
Re^2: Sort hash with values
by AnomalousMonk (Archbishop) on Jun 24, 2013 at 17:53 UTC | |
|