use strict; use warnings; use 5.010; my $rxSep = qr{[-_.]}; my @versions = qw{ 1.2.3.4 2.6 3_4_9 4-2-13-5 5 }; foreach my $version ( @versions ) { ( my $newVersion = $version ) =~ s{((?:\d+$rxSep)+)*(\d+)(?!$rxSep)} { my $ver = $2; ( defined $1 ? $1 : q{} ) . ++ $ver }e; say qq{$version => $newVersion}; }