1package version::regex; 2 3use strict; 4 5our $VERSION = '0.9930'; 6 7#--------------------------------------------------------------------------# 8# Version regexp components 9#--------------------------------------------------------------------------# 10 11# Fraction part of a decimal version number. This is a common part of 12# both strict and lax decimal versions 13 14my $FRACTION_PART = qr/\.[0-9]+/; 15 16# First part of either decimal or dotted-decimal strict version number. 17# Unsigned integer with no leading zeroes (except for zero itself) to 18# avoid confusion with octal. 19 20my $STRICT_INTEGER_PART = qr/0|[1-9][0-9]*/; 21 22# First part of either decimal or dotted-decimal lax version number. 23# Unsigned integer, but allowing leading zeros. Always interpreted 24# as decimal. However, some forms of the resulting syntax give odd 25# results if used as ordinary Perl expressions, due to how perl treats 26# octals. E.g. 27# version->new("010" ) == 10 28# version->new( 010 ) == 8 29# version->new( 010.2) == 82 # "8" . "2" 30 31my $LAX_INTEGER_PART = qr/[0-9]+/; 32 33# Second and subsequent part of a strict dotted-decimal version number. 34# Leading zeroes are permitted, and the number is always decimal. 35# Limited to three digits to avoid overflow when converting to decimal 36# form and also avoid problematic style with excessive leading zeroes. 37 38my $STRICT_DOTTED_DECIMAL_PART = qr/\.[0-9]{1,3}/; 39 40# Second and subsequent part of a lax dotted-decimal version number. 41# Leading zeroes are permitted, and the number is always decimal. No 42# limit on the numerical value or number of digits, so there is the 43# possibility of overflow when converting to decimal form. 44 45my $LAX_DOTTED_DECIMAL_PART = qr/\.[0-9]+/; 46 47# Alpha suffix part of lax version number syntax. Acts like a 48# dotted-decimal part. 49 50my $LAX_ALPHA_PART = qr/_[0-9]+/; 51 52#--------------------------------------------------------------------------# 53# Strict version regexp definitions 54#--------------------------------------------------------------------------# 55 56# Strict decimal version number. 57 58our $STRICT_DECIMAL_VERSION = 59 qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x; 60 61# Strict dotted-decimal version number. Must have both leading "v" and 62# at least three parts, to avoid confusion with decimal syntax. 63 64our $STRICT_DOTTED_DECIMAL_VERSION = 65 qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x; 66 67# Complete strict version number syntax -- should generally be used 68# anchored: qr/ \A $STRICT \z /x 69 70our $STRICT = 71 qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x; 72 73#--------------------------------------------------------------------------# 74# Lax version regexp definitions 75#--------------------------------------------------------------------------# 76 77# Lax decimal version number. Just like the strict one except for 78# allowing an alpha suffix or allowing a leading or trailing 79# decimal-point 80 81our $LAX_DECIMAL_VERSION = 82 qr/ $LAX_INTEGER_PART (?: $FRACTION_PART | \. )? $LAX_ALPHA_PART? 83 | 84 $FRACTION_PART $LAX_ALPHA_PART? 85 /x; 86 87# Lax dotted-decimal version number. Distinguished by having either 88# leading "v" or at least three non-alpha parts. Alpha part is only 89# permitted if there are at least two non-alpha parts. Strangely 90# enough, without the leading "v", Perl takes .1.2 to mean v0.1.2, 91# so when there is no "v", the leading part is optional 92 93our $LAX_DOTTED_DECIMAL_VERSION = 94 qr/ 95 v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )? 96 | 97 $LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART? 98 /x; 99 100# Complete lax version number syntax -- should generally be used 101# anchored: qr/ \A $LAX \z /x 102# 103# The string 'undef' is a special case to make for easier handling 104# of return values from ExtUtils::MM->parse_version 105 106our $LAX = 107 qr/ undef | $LAX_DOTTED_DECIMAL_VERSION | $LAX_DECIMAL_VERSION /x; 108 109#--------------------------------------------------------------------------# 110 111# Preloaded methods go here. 112sub is_strict { defined $_[0] && $_[0] =~ qr/ \A $STRICT \z /x } 113sub is_lax { defined $_[0] && $_[0] =~ qr/ \A $LAX \z /x } 114 1151; 116