Is that what you want? If it isn't, then you simply need to do a Schwartzian Transform
Using the Schwartzian Transform doesn't help at all. It's the generation of a comparable key that made the difference.
sub ip_to_key { sprintf "%03d", split /\./, $_[0] }
my @sortedKeys =
sort { ip_to_key($ipaddr{$a}) cmp ip_to_key($ipaddr{$b}) }
keys %ipaddr;
The ST is an optimisation to get more speed out of it. If you really needed speed, this is much faster:
my @sortedKeys =
map substr($_, 4),
sort
map pack('C4', split(/\./, $ipaddr{$_})) . $_,
keys %ipaddr;