use warnings; use diagnostics; use strict; my @array = ("8.foo", "6.bar", "7.baz", "5.biz", "3.fizzle", "0.fro", "9.boz"); print join "\n", map {$_->[0]} sort {$a->[1] <=> $b->[1]} map { [$_, by_number($_)] } @array; sub by_number { my $value = shift; if ($value =~ m/^(\d+)/) { return $1 } }