http://qs1969.pair.com?node_id=612060

ady has asked for the wisdom of the Perl Monks concerning the following question:

I want a rexex s///e to bump up the build number, eg. from 0.8.34.0 to 0.8.35.0. I tried the following, but was stalled in the regex...

#!/usr/bin/perl -w use strict; my $version = '0.8.34.0'; # This works as expected $version =~ /(\d+\.\d+\.)(\d+)(\.\d+)/; $version = $1 . ($2 + 1) . $3; print "$version\n"; # but this won't compile, --- why? #$version =~ s/(\d+\.\d+\.)(\d+)(\.\d+)/{$1}$2+1{$3}/e; print $version;

Update
Ok OK!! Folks, flowering TMTOWTDItis .. :-D Thanks! -- allan
#!/usr/bin/perl -w use strict; my $version = '0.8.34.0'; $version =~ /(\d+\.\d+\.)(\d+)(\.\d+)/; $version = $1 . ($2 + 1) . $3; print "$version\n"; $version =~ s/(\d+\.\d+\.)(\d+)(\.\d+)/$1.($2+1).$3/e; print "$version\n"; $version = do { my $v = [ split /\./, $version ]; $v->[2]++; join '.', + @$v }; print "$version\n"; $version =~ s/(\d+)(?=\.\d+\z)/$1 + 1/e; print "$version\n";
Beast regards -- allan

Replies are listed 'Best First'.
Re: RegEx bump version number
by jettero (Monsignor) on Apr 25, 2007 at 17:33 UTC

    Well, ... would {$1}$2+1{$3} normally compile?

    That /e means to evaluate the rhs like it was any other block of perl code.

    I suspect you want something more like $version =~ s/(\d+)(?=\.\d+\z)/$1 + 1/e;

    -Paul

Re: RegEx bump version number
by NetWallah (Canon) on Apr 25, 2007 at 17:40 UTC
    Try:
    $version =~ s/(\d+\.\d+\.)(\d+)(\.\d+)/$1.($2+1).$3/e;
    (Works for me).jettero(++)'s more concise code also works.

         "Choose a job you like and you will never have to work a day of your life" - Confucius

      Bingo! String cat seems to be the solution -- tnx a load!
      allan
Re: RegEx bump version number
by shigetsu (Hermit) on Apr 25, 2007 at 17:43 UTC
    A regular expression free version (not arguing for or against):
    $version = do { my $v = [ split /\./, '0.8.34.0' ]; $v->[2]++; join '. +', @$v };