#naive: O(N*logN) my @sorted = sort { my @a = $a =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/; my @b = $b =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/; $a[0] <=> $b[0] || $a[1] <=> $b[1] || $a[2] <=> $b[2] || $a[3] <=> $b[3] } @unsorted; #packed: O(N*logN) my @sorted = sort { pack('C4' => $a =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) cmp pack('C4' => $b =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) } @unsorted; #### Benchmark: timing 5000 iterations of naive, packed... naive: 11 wallclock secs ( 9.91 usr + 0.32 sys = 10.23 CPU) packed: 8 wallclock secs ( 7.95 usr + 0.08 sys = 8.03 CPU)