Version numbers are very flexible in Perl and unfortunately people have been abusing this freedom. even though Version numbers should be boring.

A couple of examples for version numbers:

5.010 v5.10 5.010.002 1.10 1.10_02 1.10_TEST

You might also know that 5.010 is the same as v5.10 which creates a great deal of confusion to people who are not aware of this.

There are at least two modules that handle version numbers: version and Perl::Version, but it seems only the former works properly.

So I recomment the version module.

It operator overloading to allow us to use the various numerical comparision operators such as >, < and even the spaceship operators <=> to sort a bunch of version numbers.

examples/version_example.pl



use strict; use warnings; use 5.010; use version; say version->parse( 1.23 ) < version->parse( 1.24 );

It seems to be working properly as the following cases show:

examples/version.pl



use strict; use warnings; use 5.010; use version; my @cases = ( [ 'v5.11', '5.011' ], [ 'v5.11', '5.012' ], [ '5.1.1', '5.1.2' ], [ '5.10', '5.10_01'], [ '5.10', 'v5.10'], [ '5.10', 'v5.11'], ); foreach my $c (@cases) { say '----'; say $c->[0]; say $c->[1]; say version->parse( $c->[0] ) < version->parse( $c->[1] ); say version->parse( $c->[0] ) == version->parse( $c->[1] ); }

You can also sort version numbers:

examples/sort_versions.pl



use strict; use warnings; use 5.010; use version; my @versions = ( 'v5.11', '5.011', '5.012', '5.1.1', '5.1.2', '5.10', '5.10_01'); my @sorted = sort { version->parse( $a ) <=> version->parse( $b ) } @versions; for my $s (@sorted) { say $s; }

Invalid version format

The module will not properly parse the last example:

say version->parse('1.23_TEST');

Will generate an excpetion saying Invalid version format (misplaced underscore) at ...