Skip to content

Instantly share code, notes, and snippets.

@waffle2k
Created October 2, 2012 21:19
Show Gist options
  • Save waffle2k/3823372 to your computer and use it in GitHub Desktop.
Save waffle2k/3823372 to your computer and use it in GitHub Desktop.
Parsing the version of a package
#!/usr/bin/perl
use strict;
package Version;
use overload
'""' => "str",
'cmp' => "compare",
'<=>' => "compare",
;
sub new {
my $class = shift;
my $self = {
ver => undef,
major => 0,
minor => 0,
point => 0,
@_,
};
bless $self, $class;
$self->parse;
return $self;
}
sub parse {
my ($self) = shift;
die "Version not specified" unless defined $self->{ver};
if( $self->{ver} =~ /^([^-]+?)-(\d+(?:\.\d+)*)(?:rc(\d+))?/oi ){
($self->{basename}, my $v, $self->{rc}) = ($1,$2,$3);
if( $v ){
my @a = split( /\./, $v );
if( scalar @a == 1 ){
$self->{major} = $v;
} else {
$self->{major} = $a[0];
if( scalar @a > 1 ){
$self->{minor} = $a[1];
}
if( scalar @a > 2 ){
$self->{point} = $a[2];
}
}
}
}
}
sub numeric {
my $self = shift;
my $num = sprintf( "%06d%06d%06d", $self->{major}, $self->{minor}, $self->{point} );
if( $self->{rc} == 0 ){
$num .= ".1";
} else {
$num .= ".0";
}
$num .= sprintf( "%02d", $self->{rc} );
return $num;
}
sub compare($$)
{
my ($a, $b) = @_;
return $a->numeric <=> $b->numeric;
}
sub str {
my ($self) = @_;
return $self->numeric;
}
package Main ;
use Data::Dumper;
print "This is the main part\n";
my @tests = qw/
abc-12
abc-12.3
abc-12.3.4
abc-2rc1
abc-2.1rc1
abc-2.1.2rc1
abc-2rc2
/;
for ( sort @tests ){
my $v = Version->new( ver => $_ );
print Dumper( $v ),"\n";
print "Scalar: ", scalar $v,"\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment