This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Pod::LaTeX 0.57
[perl5.git] / lib / version.pm
CommitLineData
c8d69e4a 1#!perl -w
a7ad731c
HS
2package version;
3
4use 5.005_03;
5use strict;
6
137d6fc0 7require Exporter;
a7ad731c 8require DynaLoader;
137d6fc0 9use vars qw(@ISA $VERSION $CLASS @EXPORT);
a7ad731c 10
137d6fc0 11@ISA = qw(Exporter DynaLoader);
a7ad731c 12
137d6fc0
JP
13@EXPORT = qw(qv);
14
13f8f398 15$VERSION = 0.39; # stop using CVS and switch to subversion
a7ad731c
HS
16
17$CLASS = 'version';
18
26ec6fc3 19local $^W; # shut up the 'redefined' warning for UNIVERSAL::VERSION
a7ad731c
HS
20bootstrap version if $] < 5.009;
21
22# Preloaded methods go here.
23
241;
25__END__
26
27=head1 NAME
28
29version - Perl extension for Version Objects
30
31=head1 SYNOPSIS
32
33 use version;
b9381830 34 $version = version->new("12.2.1"); # must be quoted for Perl < 5.8.1
a7ad731c
HS
35 print $version; # 12.2.1
36 print $version->numify; # 12.002001
137d6fc0 37 if ( $version gt "12.2" ) # true
a7ad731c 38
b9381830 39 $alphaver = version->new("1.2_3"); # must be quoted!
c8d69e4a
JP
40 print $alphaver; # 1.2_3
41 print $alphaver->is_alpha(); # true
137d6fc0
JP
42
43 $ver = qv(1.2); # 1.2.0
44 $ver = qv("1.2"); # 1.2.0
a7ad731c 45
b9381830 46 $perlver = version->new(5.005_03); # must not be quoted!
a7ad731c
HS
47 print $perlver; # 5.5.30
48
49=head1 DESCRIPTION
50
51Overloaded version objects for all versions of Perl. This module
26ec6fc3 52implements all of the features of version objects which will be part
137d6fc0 53of Perl 5.10.0 except automatic version object creation.
a7ad731c
HS
54
55=head2 What IS a version
56
57For the purposes of this module, a version "number" is a sequence of
58positive integral values separated by decimal points and optionally a
59single underscore. This corresponds to what Perl itself uses for a
60version, as well as extending the "version as number" that is discussed
61in the various editions of the Camel book.
62
129318bd
JP
63There are actually two distinct ways to initialize versions:
64
65=over 4
66
c8d69e4a 67=item * Numeric Versions
129318bd 68
c8d69e4a
JP
69Any initial parameter which "looks like a number", see L<Numeric
70Versions>.
71
137d6fc0 72=item * Quoted Versions
c8d69e4a 73
137d6fc0
JP
74Any initial parameter which contains more than one decimal point
75or contains an embedded underscore, see L<Quoted Versions>. The
76most recent development version of Perl (5.9.x) and the next major
77release (5.10.0) will automatically create version objects for bare
b9381830
JP
78numbers containing more than one decimal point in the appropriate
79context.
129318bd
JP
80
81=back
82
83Both of these methods will produce similar version objects, in that
b9381830
JP
84the default stringification will yield the version L<Normal Form> only
85if required:
129318bd 86
b9381830
JP
87 $v = version->new(1.002); # 1.002, but compares like 1.2.0
88 $v = version->new(1.002003); # 1.2.3
89 $v2 = version->new( "1.2.3"); # 1.2.3
90 $v3 = version->new( 1.2.3); # 1.2.3 for Perl >= 5.8.1
129318bd 91
c8d69e4a 92Please see L<"Quoting"> for more details on how Perl will parse various
129318bd 93input values.
46314c13
JP
94
95Any value passed to the new() operator will be parsed only so far as it
96contains a numeric, decimal, or underscore character. So, for example:
97
b9381830
JP
98 $v1 = version->new("99 and 94/100 percent pure"); # $v1 == 99.0
99 $v2 = version->new("something"); # $v2 == "" and $v2->numify == 0
46314c13 100
129318bd
JP
101However, see L<New Operator> for one case where non-numeric text is
102acceptable when initializing version objects.
103
137d6fc0
JP
104=head2 What about v-strings?
105
106Beginning with Perl 5.6.0, an alternate method to code arbitrary strings
107of bytes was introduced, called v-strings. They were intended to be an
108easy way to enter, for example, Unicode strings (which contain two bytes
109per character). Some programs have used them to encode printer control
110characters (e.g. CRLF). They were also intended to be used for $VERSION.
111Their use has been problematic from the start and they will be phased out
112beginning in Perl 5.10.0.
113
114There are two ways to enter v-strings: a bare number with two or more
115decimal places, or a bare number with one or more decimal places and a
116leading 'v' character (also bare). For example:
117
118 $vs1 = 1.2.3; # encoded as \1\2\3
b9381830 119 $vs2 = v1.2; # encoded as \1\2
137d6fc0
JP
120
121The first of those two syntaxes is destined to be the default way to create
122a version object in 5.10.0, whereas the second will issue a mandatory
b9381830
JP
123deprecation warning beginning at the same time. In both cases, a v-string
124encoded version will always be stringified in the version L<Normal Form>.
137d6fc0
JP
125
126Consequently, the use of v-strings to initialize version objects with
b9381830 127this module is only possible with Perl 5.8.1 or better (which contain special
137d6fc0 128code to enable it). Their use is B<strongly> discouraged in all
b9381830 129circumstances (especially the leading 'v' style), since the meaning will
137d6fc0
JP
130change depending on which Perl you are running. It is better to use
131L<"Quoted Versions"> to ensure the proper interpretation.
132
129318bd
JP
133=head2 Numeric Versions
134
137d6fc0 135These correspond to historical versions of Perl itself prior to 5.6.0,
129318bd
JP
136as well as all other modules which follow the Camel rules for the
137$VERSION scalar. A numeric version is initialized with what looks like
138a floating point number. Leading zeros B<are> significant and trailing
139zeros are implied so that a minimum of three places is maintained
140between subversions. What this means is that any subversion (digits
141to the right of the decimal place) that contains less than three digits
b9381830
JP
142will have trailing zeros added to make up the difference, but only for
143purposes of comparison with other version objects. For example:
129318bd 144
b9381830
JP
145 $v = version->new( 1.2); # prints 1.2, compares as 1.200.0
146 $v = version->new( 1.02); # prints 1.02, compares as 1.20.0
147 $v = version->new( 1.002); # prints 1.002, compares as 1.2.0
148 $v = version->new( 1.0023); # 1.2.300
149 $v = version->new( 1.00203); # 1.2.30
150 $v = version->new( 1.002_03); # 1.2.30 See "Quoting"
151 $v = version->new( 1.002003); # 1.2.3
129318bd 152
c8d69e4a 153All of the preceeding examples except the second to last are true
129318bd
JP
154whether or not the input value is quoted. The important feature is that
155the input value contains only a single decimal.
156
b9381830
JP
157IMPORTANT NOTE: If your numeric version contains more than 3 significant
158digits after the decimal place, it will be split on each multiple of 3, so
1591.0003 becomes 1.0.300, due to the need to remain compatible with Perl's
160own 5.005_03 == 5.5.30 interpretation.
161
137d6fc0 162=head2 Quoted Versions
129318bd
JP
163
164These are the newest form of versions, and correspond to Perl's own
137d6fc0
JP
165version style beginning with 5.6.0. Starting with Perl 5.10.0,
166and most likely Perl 6, this is likely to be the preferred form. This
167method requires that the input parameter be quoted, although Perl's after
1685.9.0 can use bare numbers with multiple decimal places as a special form
169of quoting.
170
171Unlike L<Numeric Versions>, Quoted Versions may have more than
b9381830
JP
172a single decimal point, e.g. "5.6.1" (for all versions of Perl). If a
173Quoted Version has only one decimal place (and no embedded underscore),
174it is interpreted exactly like a L<Numeric Version>.
129318bd
JP
175
176So, for example:
177
b9381830
JP
178 $v = version->new( "1.002"); # 1.2
179 $v = version->new( "1.2.3"); # 1.2.3
180 $v = version->new("1.0003"); # 1.0.300
129318bd 181
137d6fc0 182In addition to conventional versions, Quoted Versions can be
c8d69e4a 183used to create L<Alpha Versions>.
129318bd 184
137d6fc0 185In general, Quoted Versions permit the greatest amount of freedom
c8d69e4a 186to specify a version, whereas Numeric Versions enforce a certain
129318bd
JP
187uniformity. See also L<New Operator> for an additional method of
188initializing version objects.
46314c13 189
a7ad731c
HS
190=head2 Object Methods
191
192Overloading has been used with version objects to provide a natural
193interface for their use. All mathematical operations are forbidden,
c8d69e4a 194since they don't make any sense for base version objects.
129318bd
JP
195
196=over 4
197
c8d69e4a
JP
198=item * New Operator
199
200Like all OO interfaces, the new() operator is used to initialize
201version objects. One way to increment versions when programming is to
202use the CVS variable $Revision, which is automatically incremented by
203CVS every time the file is committed to the repository.
129318bd 204
129318bd
JP
205In order to facilitate this feature, the following
206code can be employed:
207
b9381830 208 $VERSION = version->new(qw$Revision: 2.7 $);
129318bd
JP
209
210and the version object will be created as if the following code
211were used:
212
b9381830 213 $VERSION = version->new("v2.7");
129318bd
JP
214
215In other words, the version will be automatically parsed out of the
216string, and it will be quoted to preserve the meaning CVS normally
13f8f398
JP
217carries for versions. The CVS $Revision$ increments differently from
218numeric versions (i.e. 1.10 follows 1.9), so it must be handled as if
219it were a L<Quoted Version>.
220
221New in 0.38, a new version object can be created as a copy of an existing
222version object:
223
224 $v1 = version->new(12.3);
225 $v2 = version->new($v1);
226
227and $v1 and $v2 will be identical.
129318bd 228
137d6fc0
JP
229=back
230
231=over 4
232
233=item * qv()
234
235An alternate way to create a new version object is through the exported
236qv() sub. This is not strictly like other q? operators (like qq, qw),
237in that the only delimiters supported are parentheses (or spaces). It is
238the best way to initialize a short version without triggering the floating
239point interpretation. For example:
240
241 $v1 = qv(1.2); # 1.2.0
242 $v2 = qv("1.2"); # also 1.2.0
243
244As you can see, either a bare number or a quoted string can be used, and
245either will yield the same version number.
246
247=back
248
13f8f398 249For the subsequent examples, the following three objects will be used:
a7ad731c 250
13f8f398
JP
251 $ver = version->new("1.2.3.4"); # see "Quoting" below
252 $alpha = version->new("1.2.3_4"); # see "Alpha versions" below
253 $nver = version->new(1.2); # see "Numeric Versions" above
a7ad731c 254
129318bd
JP
255=over 4
256
b9381830 257=item * Normal Form
c8d69e4a 258
b9381830
JP
259For any version object which is initialized with multiple decimal
260places (either quoted or if possible v-string), or initialized using
261the L<qv()> operator, the stringified representation is returned in
262a normalized or reduced form (no extraneous zeros):
a7ad731c 263
b9381830
JP
264 print $ver->normal; # prints as 1.2.3
265 print $ver->stringify; # ditto
266 print $ver; # ditto
267 print $nver->normal; # prints as 1.2.0
268 print $nver->stringify; # prints as 1.2, see "Stringification"
a7ad731c 269
137d6fc0 270In order to preserve the meaning of the processed version, the
b9381830
JP
271normalized representation will always contain at least three sub terms.
272In other words, the following is guaranteed to always be true:
137d6fc0
JP
273
274 my $newver = version->new($ver->stringify);
275 if ($newver eq $ver ) # always true
276 {...}
277
137d6fc0
JP
278=back
279
129318bd
JP
280=over 4
281
c8d69e4a 282=item * Numification
a7ad731c 283
c8d69e4a
JP
284Although all mathematical operations on version objects are forbidden
285by default, it is possible to retrieve a number which roughly
286corresponds to the version object through the use of the $obj->numify
287method. For formatting purposes, when displaying a number which
288corresponds a version object, all sub versions are assumed to have
289three decimal places. So for example:
129318bd 290
a7ad731c 291 print $ver->numify; # prints 1.002003
b9381830 292 print $nver->numify; # prints 1.2
a7ad731c 293
137d6fc0
JP
294Unlike the stringification operator, there is never any need to append
295trailing zeros to preserve the correct version value.
296
297=back
298
299=over 4
300
b9381830
JP
301=item * Stringification
302
303In order to mirror as much as possible the existing behavior of ordinary
304$VERSION scalars, the stringification operation will display differently,
305depending on whether the version was initialized as a L<Numeric Version>
306or L<Quoted Version>.
307
308What this means in practice is that if the normal CPAN and Camel rules are
309followed ($VERSION is a floating point number with no more than 3 decimal
310places), the stringified output will be exactly the same as the numified
311output. There will be no visible difference, although the internal
312representation will be different, and the L<Comparison operators> will
313function using the internal coding.
314
315If a version object is initialized using a L<Quoted Version> form, or if
316the number of significant decimal places exceed three, then the stringified
317form will be the L<Normal Form>. The $obj->normal operation can always be
318used to produce the L<Normal Form>, even if the version was originally a
319L<Numeric Version>.
320
321 print $ver->stringify; # prints 1.2.3
322 print $nver->stringify; # prints 1.2
323
324=back
325
326=over 4
327
c8d69e4a 328=item * Comparison operators
129318bd 329
c8d69e4a
JP
330Both cmp and <=> operators perform the same comparison between terms
331(upgrading to a version object automatically). Perl automatically
332generates all of the other comparison operators based on those two.
333In addition to the obvious equalities listed below, appending a single
334trailing 0 term does not change the value of a version for comparison
137d6fc0 335purposes. In other words "v1.2" and "1.2.0" will compare as identical.
129318bd
JP
336
337For example, the following relations hold:
a7ad731c 338
129318bd
JP
339 As Number As String Truth Value
340 --------- ------------ -----------
a7ad731c
HS
341 $ver > 1.0 $ver gt "1.0" true
342 $ver < 2.5 $ver lt true
343 $ver != 1.3 $ver ne "1.3" true
344 $ver == 1.2 $ver eq "1.2" false
345 $ver == 1.2.3 $ver eq "1.2.3" see discussion below
a7ad731c 346
137d6fc0
JP
347It is probably best to chose either the numeric notation or the string
348notation and stick with it, to reduce confusion. Perl6 version objects
349B<may> only support numeric comparisons. See also L<"Quoting">.
a7ad731c 350
b9381830
JP
351WARNING: Comparing version with unequal numbers of decimal places (whether
352explicitely or implicitely initialized), may yield unexpected results at
353first glance. For example, the following inequalities hold:
354
355 version->new(0.96) > version->new(0.95); # 0.960.0 > 0.950.0
356 version->new("0.96.1") < version->new(0.95); # 0.096.1 < 0.950.0
357
358For this reason, it is best to use either exclusively L<Numeric Versions> or
359L<Quoted Versions> with multiple decimal places.
360
137d6fc0 361=back
a7ad731c 362
137d6fc0 363=over 4
a7ad731c 364
c8d69e4a
JP
365=item * Logical Operators
366
367If you need to test whether a version object
368has been initialized, you can simply test it directly:
369
b9381830 370 $vobj = version->new($something);
c8d69e4a
JP
371 if ( $vobj ) # true only if $something was non-blank
372
137d6fc0 373You can also test whether a version object is an L<Alpha version>, for
c8d69e4a
JP
374example to prevent the use of some feature not present in the main
375release:
376
b9381830 377 $vobj = version->new("1.2_3"); # MUST QUOTE
c8d69e4a
JP
378 ...later...
379 if ( $vobj->is_alpha ) # True
380
381=back
382
a7ad731c
HS
383=head2 Quoting
384
c8d69e4a 385Because of the nature of the Perl parsing and tokenizing routines,
129318bd
JP
386certain initialization values B<must> be quoted in order to correctly
387parse as the intended version, and additionally, some initial values
388B<must not> be quoted to obtain the intended version.
389
c8d69e4a 390Except for L<Alpha versions>, any version initialized with something
129318bd
JP
391that looks like a number (a single decimal place) will be parsed in
392the same way whether or not the term is quoted. In order to be
393compatible with earlier Perl version styles, any use of versions of
394the form 5.006001 will be translated as 5.6.1. In other words, a
395version with a single decimal place will be parsed as implicitly
396having three places between subversions.
397
398The complicating factor is that in bare numbers (i.e. unquoted), the
399underscore is a legal numeric character and is automatically stripped
400by the Perl tokenizer before the version code is called. However, if
13f8f398 401a number containing one or more decimals and an underscore is quoted, i.e.
c8d69e4a 402not bare, that is considered a L<Alpha Version> and the underscore is
129318bd 403significant.
a7ad731c
HS
404
405If you use a mathematic formula that resolves to a floating point number,
406you are dependent on Perl's conversion routines to yield the version you
407expect. You are pretty safe by dividing by a power of 10, for example,
408but other operations are not likely to be what you intend. For example:
409
b9381830 410 $VERSION = version->new((qw$Revision: 1.4)[1]/10);
a7ad731c 411 print $VERSION; # yields 0.14
b9381830
JP
412 $V2 = version->new(100/9); # Integer overflow in decimal number
413 print $V2; # yields something like 11.111.111.100
a7ad731c 414
137d6fc0 415Perl 5.8.1 and beyond will be able to automatically quote v-strings
b9381830 416(although a warning may be issued under 5.9.x and 5.10.0), but that
137d6fc0 417is not possible in earlier versions of Perl. In other words:
a7ad731c 418
b9381830
JP
419 $version = version->new("v2.5.4"); # legal in all versions of Perl
420 $newvers = version->new(v2.5.4); # legal only in Perl >= 5.8.1
a7ad731c
HS
421
422
423=head2 Types of Versions Objects
424
129318bd
JP
425There are two types of Version Objects:
426
427=over 4
a7ad731c 428
c8d69e4a 429=item * Ordinary versions
a7ad731c 430
c8d69e4a
JP
431These are the versions that normal modules will use. Can contain as
432many subversions as required. In particular, those using RCS/CVS can
b9381830 433use the following:
129318bd 434
b9381830 435 $VERSION = version->new(qw$Revision: 2.7 $);
a7ad731c 436
c8d69e4a
JP
437and the current RCS Revision for that file will be inserted
438automatically. If the file has been moved to a branch, the Revision
439will have three or more elements; otherwise, it will have only two.
440This allows you to automatically increment your module version by
441using the Revision number from the primary file in a distribution, see
442L<ExtUtils::MakeMaker/"VERSION_FROM">.
a7ad731c 443
137d6fc0 444=item * Alpha versions
129318bd 445
c8d69e4a
JP
446For module authors using CPAN, the convention has been to note
447unstable releases with an underscore in the version string, see
448L<CPAN>. Alpha releases will test as being newer than the more recent
449stable release, and less than the next stable release. For example:
129318bd 450
b9381830 451 $alphaver = version->new("12.3_1"); # must quote
a7ad731c
HS
452
453obeys the relationship
454
c8d69e4a 455 12.3 < $alphaver < 12.4
a7ad731c
HS
456
457As a matter of fact, if is also true that
458
c8d69e4a 459 12.3.0 < $alphaver < 12.3.1
a7ad731c 460
c8d69e4a
JP
461where the subversion is identical but the alpha release is less than
462the non-alpha release.
a7ad731c 463
13f8f398
JP
464Alpha versions with a single decimal place will be treated exactly as if
465they were L<Numeric Versions>, for parsing purposes. The stringification for
466alpha versions with a single decimal place may seem suprising, since any
467trailing zeros will visible. For example, the above $alphaver will print as
468
469 12.300_100
470
471Alpha versions with more than a single decimal place will be treated
472exactly as if they were L<Quoted Versions>, and will display without any
473trailing (or leading) zeros, in the L<Version Normal> form. For example,
474
475 $newver = version->new("12.3.1_1");
476 print $newver; # 12.3.1_1
477
a7ad731c
HS
478=head2 Replacement UNIVERSAL::VERSION
479
480In addition to the version objects, this modules also replaces the core
481UNIVERSAL::VERSION function with one that uses version objects for its
b9381830
JP
482comparisons. The return from this operator is always the numified form,
483and the warning message generated includes both the numified and normal
484forms (for clarity).
485
486For example:
487
488 package Foo;
489 $VERSION = 1.2;
490
491 package Bar;
492 $VERSION = "1.3.5"; # works with all Perl's (since it is quoted)
493
494 package main;
495 use version;
496
497 print $Foo::VERSION; # prints 1.2
498
499 print $Bar::VERSION; # prints 1.003005
500
501 eval "use CGI 10"; # some far future release
502 print $@; # prints "CGI version 10 (10.0.0) required..."
503
504IMPORTANT NOTE: This may mean that code which searches for a specific
505string (to determine whether a given module is available) may need to be
506changed.
a7ad731c 507
13f8f398
JP
508The replacement UNIVERSAL::VERSION, when used as a function, like this:
509
510 print $module->VERSION;
511
512will follow the stringification rules; i.e. Numeric versions will be displayed
513with the numified format, and the rest will be displayed with the Normal
514format. Technically, the $module->VERSION function returns a string (PV) that
515can be converted to a number following the normal Perl rules, when used in a
516numeric context.
517
518
a7ad731c
HS
519=head1 EXPORT
520
137d6fc0 521qv - quoted version initialization operator
a7ad731c
HS
522
523=head1 AUTHOR
524
525John Peacock E<lt>jpeacock@rowman.comE<gt>
526
527=head1 SEE ALSO
528
529L<perl>.
530
531=cut