CPAN and Tooling Concepts
Version Compare
A tool can compare fixed version strings to decide whether a requirement is met.
version requirement
A version requirement names the minimum version a dependency should provide.
Version Compare
version_compare.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;
sub version_at_least {
my ($current, $required) = @_;
my ($cur_major, $cur_minor, $cur_patch) = split /\./, $current;
my ($req_major, $req_minor, $req_patch) = split /\./, $required;
my $current_number = $cur_major * 10000 + $cur_minor * 100 + $cur_patch;
my $required_number = $req_major * 10000 + $req_minor * 100 + $req_patch;
return $current_number >= $required_number;
}
my $current = "1.4.0";
my $required = "1.3.0";
my $ok = version_at_least($current, $required);
my $status = $ok ? "ok" : "upgrade";
print "current=$current\n";
print "required=$required\n";
print "status=$status\n";
use strict;
use warnings;
sub version_at_least {
my ($current, $required) = @_;
my ($cur_major, $cur_minor, $cur_patch) = split /\./, $current;
my ($req_major, $req_minor, $req_patch) = split /\./, $required;
my $current_number = $cur_major * 10000 + $cur_minor * 100 + $cur_patch;
my $required_number = $req_major * 10000 + $req_minor * 100 + $req_patch;
return $current_number >= $required_number;
}
my $current = "1.2.0";
my $required = "1.3.0";
my $ok = version_at_least($current, $required);
my $status = $ok ? "ok" : "upgrade";
print "current=$current\n";
print "required=$required\n";
print "status=$status\n";
use strict;
use warnings;
sub version_at_least {
my ($current, $required) = @_;
my ($cur_major, $cur_minor, $cur_patch) = split /\./, $current;
my ($req_major, $req_minor, $req_patch) = split /\./, $required;
my $current_number = $cur_major * 10000 + $cur_minor * 100 + $cur_patch;
my $required_number = $req_major * 10000 + $req_minor * 100 + $req_patch;
return $current_number >= $required_number;
}
my $current = "2.0.0";
my $required = "1.3.0";
my $ok = version_at_least($current, $required);
my $status = $ok ? "ok" : "upgrade";
print "current=$current\n";
print "required=$required\n";
print "status=$status\n";
$current ← 1.4.0, $required ← 1.3.0
13my $current→ 1.4.0 = "1.4.0"; #@current="1.2.0", "2.0.0"14my $required→ 1.3.0 = "1.3.0";15my $ok = version_at_least($current1.4.0, $required1.3.0);16my $status = $ok ? "ok" : "upgrade";$current ← 1.4.0, $required ← 1.3.0, $cur_major ← 1, $cur_minor ← 4
4sub version_at_least {5 my ($current→ 1.4.0, $required→ 1.3.0) = @_;6 my ($cur_major→ 1, $cur_minor→ 4, $cur_patch→ 0) = split /\./, $current1.4.0;7 my ($req_major→ 1, $req_minor→ 3, $req_patch→ 0) = split /\./, $required1.3.0;8 my $current_number→ 10400 = $cur_major1 * 10000 + $cur_minor4 * 100 + $cur_patch0;9 my $required_number→ 10300 = $req_major1 * 10000 + $req_minor3 * 100 + $req_patch0;10 return $current_number10400 >= $required_number10300;11}$ok ← 1, $status ← ok
14my $required = "1.3.0";15my $ok→ 1 = version_at_least($current1.4.0, $required1.3.0);16my $status→ ok = $ok1 ? "ok" : "upgrade";1718print "current=$current1.4.0\n";19print "required=$required1.3.0\n";20print "status=$statusok\n";outputcurrent=1.4.0 required=1.3.0 status=ok
$current ← 1.2.0, $required ← 1.3.0
13my $current→ 1.2.0 = "1.2.0";14my $required→ 1.3.0 = "1.3.0";15my $ok = version_at_least($current1.2.0, $required1.3.0);16my $status = $ok ? "ok" : "upgrade";$current ← 1.2.0, $required ← 1.3.0, $cur_major ← 1, $cur_minor ← 2
4sub version_at_least {5 my ($current→ 1.2.0, $required→ 1.3.0) = @_;6 my ($cur_major→ 1, $cur_minor→ 2, $cur_patch→ 0) = split /\./, $current1.2.0;7 my ($req_major→ 1, $req_minor→ 3, $req_patch→ 0) = split /\./, $required1.3.0;8 my $current_number→ 10200 = $cur_major1 * 10000 + $cur_minor2 * 100 + $cur_patch0;9 my $required_number→ 10300 = $req_major1 * 10000 + $req_minor3 * 100 + $req_patch0;10 return $current_number10200 >= $required_number10300;11}$ok ← (empty), $status ← upgrade
14my $required = "1.3.0";15my $ok→ (empty) = version_at_least($current1.2.0, $required1.3.0);16my $status→ upgrade = $ok(empty) ? "ok" : "upgrade";1718print "current=$current1.2.0\n";19print "required=$required1.3.0\n";20print "status=$statusupgrade\n";outputcurrent=1.2.0 required=1.3.0 status=upgrade
$current ← 2.0.0, $required ← 1.3.0
13my $current→ 2.0.0 = "2.0.0";14my $required→ 1.3.0 = "1.3.0";15my $ok = version_at_least($current2.0.0, $required1.3.0);16my $status = $ok ? "ok" : "upgrade";$current ← 2.0.0, $required ← 1.3.0, $cur_major ← 2, $cur_minor ← 0
4sub version_at_least {5 my ($current→ 2.0.0, $required→ 1.3.0) = @_;6 my ($cur_major→ 2, $cur_minor→ 0, $cur_patch→ 0) = split /\./, $current2.0.0;7 my ($req_major→ 1, $req_minor→ 3, $req_patch→ 0) = split /\./, $required1.3.0;8 my $current_number→ 20000 = $cur_major2 * 10000 + $cur_minor0 * 100 + $cur_patch0;9 my $required_number→ 10300 = $req_major1 * 10000 + $req_minor3 * 100 + $req_patch0;10 return $current_number20000 >= $required_number10300;11}$ok ← 1, $status ← ok
14my $required = "1.3.0";15my $ok→ 1 = version_at_least($current2.0.0, $required1.3.0);16my $status→ ok = $ok1 ? "ok" : "upgrade";1718print "current=$current2.0.0\n";19print "required=$required1.3.0\n";20print "status=$statusok\n";outputcurrent=2.0.0 required=1.3.0 status=ok