NAME
Version::libversion::XS - Perl binding for libversion
SYNOPSIS
use Version::libversion::XS;
# OO-interface
if ( Version::libversion::XS->new($v1) == Version::libversion::XS->new($v2) ) {
# do stuff
}
# Sorting mixed version styles
@ordered = sort { Version::libversion::XS->new($a) <=> Version::libversion::XS->new($b) } @list;
# Functional interface
use Version::libversion::XS ':all';
say '0.99 < 1.11' if(version_compare2('0.99', '1.11') == -1);
say '1.0 == 1.0.0' if(version_compare2('1.0', '1.0.0') == 0);
say '1.0alpha1 < 1.0.rc1' if(version_compare2('1.0alpha1', '1.0.rc1') == -1);
say '1.0 > 1.0.rc1' if(version_compare2('1.0', '1.0-rc1') == 1);
say '1.2.3alpha4 is the same as 1.2.3~a4' if(version_compare2('1.2.3alpha4', '1.2.3~a4') == 0);
# by default, 'p' is treated as 'pre' ...
say '1.0p1 == 1.0pre1' if(version_compare2('1.0p1', '1.0pre1') == 0);
say '1.0p1 < 1.0post1' if(version_compare2('1.0p1', '1.0post1') == -1);
say '1.0p1 < 1.0patch1' if(version_compare2('1.0p1', '1.0patch1') == -1);
# ... but this is tunable: here it's handled as 'patch'
say '1.0p1 > 1.0pre1' if(version_compare4('1.0p1', '1.0pre1', VERSIONFLAG_P_IS_PATCH, 0) == 1);
say '1.0p1 == 1.0post1' if(version_compare4('1.0p1', '1.0post1', VERSIONFLAG_P_IS_PATCH, 0) == 0);
say '1.0p1 == 1.0patch1' if(version_compare4('1.0p1', '1.0patch1', VERSIONFLAG_P_IS_PATCH, 0) == 0);
# a way to check that the version belongs to a given release
if(
(version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) &&
(version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1) &&
(version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) &&
(version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1)
) {
say '1.0alpha1 and 1.0.1 belong to 1.0 release, e.g. they lie between' .
'(lowest possible version in 1.0) and (highest possible version in 1.0)';
}
DESCRIPTION
Perl bindings for libversion
, which provides fast, powerful and correct generic version string comparison algorithm.
See libversion
repository for more details on the algorithm.
https://github.com/repology/libversion
FUNCTIONAL INTERFACE
They are exported by default:
- version_compare2 ( $v1, $v2 )
-
say '0.99 < 1.11' if(version_compare2('0.99', '1.11') == -1); say '1.0 == 1.0.0' if(version_compare2('1.0', '1.0.0') == 0); say '1.0alpha1 < 1.0.rc1' if(version_compare2('1.0alpha1', '1.0.rc1') == -1); say '1.0 > 1.0.rc1' if(version_compare2('1.0', '1.0-rc1') == 1); say '1.2.3alpha4 is the same as 1.2.3~a4' if(version_compare2('1.2.3alpha4', '1.2.3~a4') == 0); # by default, 'p' is treated as 'pre' (see version_compare4) say '1.0p1 == 1.0pre1' if(version_compare2('1.0p1', '1.0pre1') == 0); say '1.0p1 < 1.0post1' if(version_compare2('1.0p1', '1.0post1') == -1); say '1.0p1 < 1.0patch1' if(version_compare2('1.0p1', '1.0patch1') == -1);
- version_compare4 ( $v1, $v2, $v1_flags, $v2_flags )
-
# Export all constants use Version::libversion::XS ':all'; # by default, 'p' is treated as 'pre' but this is tunable: here it's handled as 'patch' say '1.0p1 > 1.0pre1' if(version_compare4('1.0p1', '1.0pre1', VERSIONFLAG_P_IS_PATCH, 0) == 1); say '1.0p1 == 1.0post1' if(version_compare4('1.0p1', '1.0post1', VERSIONFLAG_P_IS_PATCH, 0) == 0); say '1.0p1 == 1.0patch1' if(version_compare4('1.0p1', '1.0patch1', VERSIONFLAG_P_IS_PATCH, 0) == 0); # a way to check that the version belongs to a given release if( (version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) && (version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1) && (version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) && (version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1) ) { say '1.0alpha1 and 1.0.1 belong to 1.0 release, e.g. they lie between' . '(lowest possible version in 1.0) and (highest possible version in 1.0)'; }
- version_compare ( $v1, $v2, [ $v1_flags, $v2_flags ] )
-
Alias of
version_compare4
CONSTANTS
- LIBVERSION_VERSION
-
Expose libversion version
Flags
- VERSIONFLAG_P_IS_PATCH
- VERSIONFLAG_ANY_IS_PATCH
- VERSIONFLAG_LOWER_BOUND
- VERSIONFLAG_UPPER_BOUND
Flags alias:
- P_IS_PATCH
- ANY_IS_PATCH
- LOWER_BOUND
- UPPER_BOUND
OBJECT-ORIENTED INTERFACE
How to compare version objects
Version::libversion::XS
objects overload the cmp
and <=>
operators. Perl automatically generates all of the other comparison operators based on those two so all the normal logical comparisons will work.
if ( Version::libversion::XS->new($v1) == Version::libversion::XS->new($v2) ) {
# do stuff
}
If a version object is compared against a non-version object, the non-object term will be converted to a version object using new()
. This may give surprising results:
$v1 = Version::libversion::XS->new("v0.95.0");
$bool = $v1 < 0.94; # TRUE
Always comparing to a version object will help avoid surprises:
$bool = $v1 < Version::libversion::XS->new("v0.94.0"); # FALSE
SUPPORT
Bugs / Feature Requests
Please report any bugs or feature requests through the issue tracker at https://github.com/giterlizzi/perl-Version-libversion-XS/issues. You will be notified automatically of any progress on your issue.
Source Code
This is open source software. The code repository is available for public review and contribution under the terms of the license.
https://github.com/giterlizzi/perl-Version-libversion-XS
git clone https://github.com/giterlizzi/perl-Version-libversion-XS.git
AUTHOR
Giuseppe Di Terlizzi <gdt@cpan.org>
LICENSE AND COPYRIGHT
This software is copyright (c) 2024 by Giuseppe Di Terlizzi.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.