#!/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; }