Leser: 19
1 2 3 4 5 6 7 8 9 10
#!/usr/bin/perl -w use strict; use warnings; my $ExtUtils_Installed_liefert_zu_CPAN = '1.94_54'; my $benoetigte_version_als_beispiel = '1.94_53'; if ($ExtUtils_Installed_liefert_zu_CPAN >= $benoetigte_version_als_beispiel) { print "ja, installierte ist passend oder neuer\n"; }
1
2
3
Argument "1.94_53" isn't numeric in numeric ge (>=) at test14.pl line 8.
Argument "1.94_54" isn't numeric in numeric ge (>=) at test14.pl line 8.
ja, installierte ist passend oder neuer
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
#!/usr/bin/perl -w use strict; use warnings; foreach my $test ( '0.710.08', '1.93_99', '1.94_53', '1.94_54', '1.94_55', '23', '13,56', ) { print "Version '$test' = " . versionsangabe ($test) . "\n"; } sub versionsangabe { my $pot = -1; my $zahl = ''; my $ergebnis = 0; for (my $pos = length ($_[0]) - 1; $pos >= 0 ; $pos --) { my $char = substr ($_[0],$pos,1); if ( $char =~ /[^0-9]/ || !$pos ) { $pot ++; $zahl = "$char$zahl" if !$pos; $ergebnis += $zahl * (10 ** $pot); $zahl = ''; } else { $zahl = "$char$zahl"; } } return $ergebnis; }
1
2
3
4
5
6
7
Version '0.710.08' = 7108
Version '1.93_99' = 1129
Version '1.94_53' = 1093
Version '1.94_54' = 1094
Version '1.94_55' = 1095
Version '23' = 23
Version '13,56' = 186
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; }
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
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 @versions=@_; for my $ver (@versions) { if($ver=~/^(\d+)(?:\D(\d+)(?:\D(\d+)?))?$/) { $ver=$1*1000*1000; $ver+=$2*1000 if($2); $ver+=$3 if($3); } else { return 'E' } } return '=' if($versions[0] == $versions[1]); return '>' if($versions[0] > $versions[1]); return '<' if($versions[0] < $versions[1]); return 'E'; }
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
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 @versions=@_; for my $ver (@versions) { my @l=split(/\D+/$ver); return 'E' unless(@l); $ver=\@l; } for my $pos (0..2) { return '<' if($versions[0][$pos] < $versions[1][$pos]); return '>' if($versions[0][$pos] > $versions[1][$pos]); } return '='; }
1 2 3 4 5 6 7 8
use version; use strict; use warnings; use Data::Dumper; my @ordered = sort { version->parse($b) <=> version->parse($a) } ('1.93_99', '1.94_55'); print Dumper(\@ordered);
1 2 3 4 5 6 7
use ExtUtils::MakeMaker; WriteMakefile( NAME => 'myscript', VERSION_FROM => 'lib/MyScript.pm', PREREQ_PM => {'Mod1' => '>1.0.4', 'Mod2' => '1.0'} );
Undefined subroutine &version::is_lax called at sub_versionsvergleich.pl line 57.