my @data = qw/ ID12-ABC-5.1 ID9-ABC-5.1 ID3-ABC-6.1 ABC-5.1 ID12-ABC-5.1.5 ID15-ABC-6.1 ABC-6.1 ID5-ABC-5.1 ID5-ABC-5.1.5 ABC-5.1.5 /; my @sorted = do{ no warnings 'uninitialized'; map { $_->[-1] } sort{ $b->[0] cmp $a->[0] or # 'ID' component. $b->[3] <=> $a->[3] or # v-string part1. $b->[4] <=> $a->[4] or # v-string part2. $b->[5] <=> $a->[5] or # v-string part3. $b->[1] <=> $a->[1] or # Numeric following 'ID'. $b->[2] cmp $a->[2] # 'ABC' component. } map { [ m/^ (?:(\p{Alphabetic}+)(\d+)-)? # "ID", then digits. (\p{Alphabetic}+)- # "ABC" component. (\d+) # v-string part1. (?:\.(\d+))? # v-string part2. (?:\.?(\d+))? # v-string part3. $/x, $_ ] } @data; }; say for @sorted;