В нерабочем коде есть простая опечатка. У вас есть:
@versions = sort { version->parse($a =~ s/^\D+//r) cmp version->parse($b =~ s/^D+//r) } @versions;
Это может быть лучше отформатировано как:
@versions = sort { version->parse($a =~ s/^\D+//r) cmp
version->parse($b =~ s/^D+//r) } @versions;
Разделение на две строки, асимметрия (ошибка) очевидна.
Вы пропускаете обратную косую черту до второго D
:
@versions = sort { version->parse($a =~ s/^\D+//r) cmp
version->parse($b =~ s/^\D+//r) } @versions;