假设我有2个版本变量:
$one = "1.2.3"
$two = "1.2.4"
如何比较这两个版本变量,以了解版本是否匹配或一个>两个或一个<两个?
请注意,我有一个只读系统,无法添加任何Perl模块。因此,我无法添加version
Perl模块。
答案 0 :(得分:7)
对于您发布的字符串,只要每个组件均小于10,标准字符串比较运算符(cmp
,lt
等)就可以使用。
对于您发布的字符串,只要每个组件小于2 32 ,标准字符串比较运算符(cmp
,lt
等)就可以使用首先使用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 足够。