Thread Modulversion vergleichen (15 answers)
Opened by bianca at 2010-11-28 08:35

bianca
 2010-11-28 10:45
#143149 #143149
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Damit komme ich natürlich nicht weiter, wie ich selbst feststelle.

Dies hier ist ein funktionierender Ansatz.
Frage in die Runde: Ist diese Interpretation der Versionsnummern korrekt?
Von links nach rechts den ersten Unterschied finden und dann bei unterschiedlich langem Aufbau am Ende auf != 0 untersuchen?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/perl -w
use strict;
use warnings;

my %tests = (
    1 => {
        a           => '0.710.08',
        b           => '0.710.09',
        erwartet    => '<',
    },
    2 => {
        a           => '0.710.00',
        b           => '0.710.00',
        erwartet    => '=',
    },
    3 => {
        a           => '0.710.00',
        b           => '0.710',
        erwartet    => '=',
    },
    4 => {
        a           => '0.710.09',
        b           => '0.710.08',
        erwartet    => '>',
    },
    5 => {
        a           => '0.710',
        b           => '0.710.00',
        erwartet    => '=',
    },
    6 => {
        a           => '1.93_99',
        b           => '1.93_099',
        erwartet    => '=',
    },
    7 => {
        a           => '1.93_99',
        b           => '1.94',
        erwartet    => '<',
    },
    8 => {
        a           => '2',
        b           => '1',
        erwartet    => '>',
    },
);

foreach my $nr (keys %tests) {
    my $erg = versionsvergleich($tests{$nr}{a},$tests{$nr}{b});
    print "$tests{$nr}{a} / $tests{$nr}{b} => '$erg' " . ($erg eq $tests{$nr}{erwartet} ? 'passed' : 'FAILED!!!') . "\n";
}

###############################################################################

sub versionsvergleich {
    #
    # Rückgabe:
    # =========
    # > = linke Version ist höher
    # = = Versionen sind gleich
    # < = rechte Version ist höher
    # E = Fehler aufgetreten
    #
    return 'E' if !defined $_[0] || $_[0] eq '' || !defined $_[1] || $_[1] eq '';
    my @teil;
    @{$teil[0]} = split /[^0-9]/,$_[0];
    @{$teil[1]} = split /[^0-9]/,$_[1];
    my $ret = '';
    my $kuerzer = (scalar @{$teil[0]} <= scalar @{$teil[1]} ? 0 : 1);
    for (my $z = 0; $z < scalar @{$teil[$kuerzer]}; $z ++) {                                                    # von links den ersten Unterschied finden
        if ($teil[0][$z] > $teil[1][$z]) {
            $ret = '>';
            last;
        }
        elsif ($teil[0][$z] < $teil[1][$z]) {
            $ret = '<';
            last;
        }
    }
    if ($ret eq '') {                                                                                           # bis hierher gleich
        if (scalar @{$teil[0]} == scalar @{$teil[1]}) {                                                         # müssen gleich sein
            $ret = '=';
        }
        else {                                                                                                  # andere Länge
            my $laenger = ($kuerzer ? 0 : 1);                                                                   # der längere ist der der nicht der kürzere ist
            my $start = scalar @{$teil[$laenger]} - (scalar @{$teil[$laenger]} - scalar @{$teil[$kuerzer]});    # Beginn ab dem überschüssigen Teil
            for (my $z = $start; $z < scalar @{$teil[$laenger]}; $z ++) {
                if ($teil[$laenger][$z] > 0) {
                    $ret = ($laenger ? '<' : '>');
                    last;
                }
            }
            $ret = '=' if $ret eq '';
        }
    }
    return $ret;
}
10 print "Hallo"
20 goto 10

View full thread Modulversion vergleichen