foreach (sort ipsort keys %ip) { # each sorted key will be in $_ } sub ipsort { my @a = split /\./, $a; my @b = split /\./, $b; return $a[0] <=> $b[0] || $a[1] <=> $b[1] || $a[2] <=> $b[2] || $a[3] <=> $b[3]; }