比较版本而不使用版本CPAN模块

时间:2019-11-11 11:55:25

标签: perl

假设我有2个版本变量:

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

如何比较这两个版本变量,以了解版本是否匹配或一个>两个或一个<两个?

请注意,我有一个只读系统,无法添加任何Perl模块。因此,我无法添加version Perl模块。

2 个答案:

答案 0 :(得分:7)

对于您发布的字符串,只要每个组件均小于10,标准字符串比较运算符(cmplt等)就可以使用。

对于您发布的字符串,只要每个组件小于2 32 ,标准字符串比较运算符(cmplt等)就可以使用首先使用pack('N*', split(/\./, $v))对其进行转换。

但这不适用于Perl世界中所有常见的版本。如果那是您必须处理的版本类型,请使用版本模块。 (这不需要从CPAN安装任何东西,因此可以满足您的要求。)

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

创建的对象将覆盖数字和字符串比较运算符,以便可以将它们用于比较对象。

答案 1 :(得分:0)

请查看以下解决方案是否符合您的要求

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 足够。