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

current
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";
  1. $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";
  2. $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}
  3. $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
  1. $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";
  2. $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}
  3. $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
  1. $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";
  2. $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}
  3. $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