in reply to Custom Sort Array
Anyway, here's my try. I did not check thoroughly, but it seems to work.
sub natural_sort { my $idx = shift || 0; return -1 if !defined $a->[$idx]; return 1 if !defined $b->[$idx]; if ($a->[$idx] =~ /^[0-9]/ and $b->[$idx] =~ /^[0-9]/) { $a->[$idx] <=> $b->[$idx] or natural_sort($idx + 1); } else { $a->[$idx] cmp $b->[$idx] or natural_sort($idx + 1); } } my @files = <DATA>; print for map { join "", @$_ } sort natural_sort map { [ split /(\d+)/, $_ ] } @files; __DATA__ abcd1_abc_123456.abc1a_A.201307290800-0900-0.gz abcd1_abc_123456.abc1a_A.201307290800-0900-1.gz abcd1_abc_123456.abc1a_A.201307290800-0900-10.gz abcd1_abc_123456.abc1a_A.201307290800-0900-11.gz abcd1_abc_123456.abc1a_A.201307290800-0900-2.gz abcd1_abc_123456.abc1a_A.201307290800-0900-3.gz abcd1_abc_123456.abc1a_A.201306290800-0900-0.gz abcd1_abc_123456.abc1a_A.201306290800-0900-1.gz abcd1_abc_123456.abc1a_A.201306290800-0900-10.gz abcd1_abc_123456.abc1a_A.201305290800-0900-11.gz abcd1_abc_123456.abc1a_A.201308290800-0900-2.gz abcd1_abc_123456.abc1a_A.201302290800-0900-3.gz abcd1_abc_123456.abc1a_A.201306290800-1000-1.gz abcd1_abc_123456.abc1a_A.201306290800-1000-10.gz abcd1_abc_123456.abc1a_A.201305290800-1000-11.gz abcd1_abc_123456.abc1a_A.201308290800-1000-2.gz abcd1_abc_123456.abc1a_A.201302290800-1000-3.gz
|
|---|