my @to_be_sorted; foreach my $filename (@filelist) { my ($root, $version) = $filename =~ /([a-z]+)_(\d+\.\d+\.\d+)/; my ($major, $minor, $third) = split /\./, $version; push @to_be_sorted, [$filename, $root, $major, $minor, $third]; } #### 0 ARRAY(0x600500678) 0 'bar_123.10.0_deb' 1 'bar' 2 123 3 10 4 0 #### my @sorted_array = map {$_->[0]} sort { $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] || $a->[3] <=> $b->[3] || $a->[4] <=> $b->[4] } @to_be_sorted;