Сравнение версий без использования модуля CPAN версии - PullRequest
0 голосов
/ 11 ноября 2019

Предположим, у меня есть 2 переменные версии:

$one = "1.2.3"
$two = "1.2.4"

Как сравнить эти две переменные версии с тем, соответствуют ли версии ИЛИ одна> две ИЛИ одна <две? </p>

Обратите внимание, чтоУ меня есть система только для чтения, где я не могу добавить какие-либо модули Perl. Поэтому я не могу добавить version Perl-модуль.

Ответы [ 2 ]

7 голосов
/ 11 ноября 2019

Для строк, которые вы разместили, стандартные операторы сравнения строк (cmp, lt и т. Д.) Будут работать, пока каждый компонент меньше 10.

Для строк, которые вы разместили,стандартные операторы сравнения строк (cmp, lt и т. д.) будут работать до тех пор, пока каждый компонент меньше 2 32 , если вы преобразуете их, используя сначала pack('N*', split(/\./, $v)).

Ноэто не будет работать для всех версий, обычно встречающихся в мире Perl. Если вы имеете дело с версиями, используйте модуль версий. (Для этого не требуется ничего устанавливать из CPAN, поэтому он соответствует вашим требованиям.)

my $v1 = version->parse($one);
my $v2 = version->parse($two);

Созданные объекты переопределяют операторы сравнения чисел и строк, чтобы их можно было использовать для сравнения объектов.

0 голосов
/ 12 ноября 2019

Пожалуйста, посмотрите, будет ли следующее решение соответствовать вашим требованиям

use strict;
use warnings;

my $sign;

my $prev = <DATA>;

chomp $prev;

while( my $new = <DATA> ) {
    chomp $new;

    my $str_new  = $new;
    my $str_prev = $prev;

    $str_prev =~ s/\.//g;
    $str_new  =~ s/\.//g;

    my $d_length = length($str_prev) - length($str_new);

    $str_new  .= '0' x  $d_length if $d_length > 0;
    $str_prev .= '0' x -$d_length if $d_length < 0;

    $sign = "=" if $str_new == $str_prev;
    $sign = ">" if $str_new > $str_prev;
    $sign = "<" if $str_new < $str_prev;

    printf "%-5s %s %-5s\n", $new, $sign, $prev;

    $prev = $new;
}


__DATA__
1.2.3
1.2.4
1.2
1.3.5
1.3.5
1.3.0

Код открыт для продуктивной критики.

Если вам нужно узнать, какая версия больше , меньше или равна , тогда cmp на двух числах будетдостаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...