From: "Dr.Ruud" <[EMAIL PROTECTED]>
> "Jenda Krynicky" schreef:
> 
> > Having a string like this:
> >
> >   $version = 'Version: 1.47.785';
> >
> > increment the last number. I seriously doubt you can do anything even
> > remotely as simple as
> >
> >  $version =~ s/^(Version:\s*(?:\d+\.)*)(\d+)/$1 . ($2+1)/e;
> 
> - never trust your own (often temporary) definition of simple.
> - be careful when to use \d, that set can contain more than 100
> characters.

Beg your pardon?

> - you are using string evaluation. (read perlretut again)

No I'm not. It's a single /e, not double /ee. The stuff inside the 
matched string is not evaluated as Perl code. Read perlretut again.

> - you don't offer an easy choice of which part to increment.

That was not in the original request. Don't

> Alternative way, without string evaluation, using split with a simple
> regex:
> 
> #!/usr/bin/perl
>   use strict;
>   use warnings;
> 
>   my $version = 'Version: 1.47.785';
> 
>   my @parts   = split /[.]/, $version;

No need for a character group:

 my @parts   = split /\./, $version;

>   ++$parts[-1];
> 
>   $version    = join ".", @parts;
> 
>   print $version, "\n";
> __END__
> 
> 
> > Make sure it works for
> >
> >   $version = 'Version:1.47.789';
> >
> > as well. Without string eval() if I may ask.
> 
> Make sure it works for 1.02.003 as well, without string eval, and with
> easy choice of incrementing what part.

Rinse and repeat. There is no string eval in my code, incrementing 
other parts was not wanted. You are right about the .003 though, I 
stand corrected on that one.

  $version =~ s/^(Version:\s*(?:\d+\.)*)(\d+)/my $ver = $2; ++$ver, 
$1 . $ver/e;

OTOH, your original code using the version strings did not even 
support anything like 1.02.003.

> So version_inc("Version:1.02.003", -2, 1) should return
> "Version:1.03.000".
> And version_inc("  Version : 1.02.003 ", 1, 1) should likely return "
> Version : 2.00.000 ".
> Without cvs if I may ask.

If this was required then I'd use split() as well

sub version_inc {
  my ($str, $part, $by) = @_;

  my ($prefix, $ver) = ($str =~ /^(.*?)((?:\d+\.)*\d+)/) 
    or die 'Invalid format';
  my @ver = split /\./, $ver;

  $part-- if $part > 0; # OK, let's have it 1 based

  $ver[$part] = sprintf( "%0" . length($ver[$part]) . "d", 
$ver[$part] + $by);
  if ($part != -1 and $part != $#ver) {
    $part  = @ver + $part if $part < 0;
    tr/0-9/0/ for (@ver[$part+1 .. $#ver])
  }

  return $prefix . join( '.', @ver);
}

Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to