编写程序以使用perl比较2个版本

时间:2015-02-10 11:00:02

标签: perl

以下程序是否正确比较两个版本? 比如v1 = 3.0.1,v2 = 4.5.5

sub VerChecker
{
my $v1 = shift;
my $v2 = shift;

my @v1_parts = split (/./, $v1);
my @v2_parts = split (/./, $v2);

for( my $i = 0; $i < @v1_parts; $i++ ) 
{
if( $v1_parts[$i] < $v2_parts[$i] ) 
{
return -1;
}
elsif( $v1_parts[$i] > $v2_parts[$i] )
{
return 1;
}
}

 # equal !
 return 0;
}

您能否更正上述代码

1 个答案:

答案 0 :(得分:1)

#!/bin/env perl
use strict;
use warnings;

sub ver_checker {
    my ($v1, $v2) = @_;

    my @v1_parts = split(/\./, $v1);
    my @v2_parts = split(/\./, $v2);

    my $num_parts = scalar @v1_parts;
    if (scalar @v2_parts > $num_parts) {
        $num_parts = scalar @v2_parts;
    }

    for my $part (0 .. $num_parts-1) {
        $v1_parts[$part] = sprintf("%04d", $v1_parts[$part] // 0);
        $v2_parts[$part] = sprintf("%04d", $v2_parts[$part] // 0);
    }

    return join('', @v1_parts) cmp join('', @v2_parts);
}

print ver_checker('3.0.1', '4.5.5')."\n";
print ver_checker('3.0', '4.5.5')."\n";
print ver_checker('3.0.1', '4')."\n";
print ver_checker('5', '4')."\n";

有几点要提及:

  1. use strict; use warnings;总是
  2. 骆驼案不再有趣了。使用lowercase_and_underscores
  3. 在正则表达式中转义文字。你的分裂需要逃避这段时间
  4. 我发现当比较像这样点缀的东西时,更容易将所有内容填充并比较字符串。如果版本号是三个虚线数字,则仅考虑您的代码。我选择了最长的虚线数字并填充了两个(即。3.1 vs 5.0.1基本上变为3.1.0 vs 5.0.1,并填充到{{{}} 1}} vs 000300010000000500000001会返回您的cmp值。
  5. 澄清你的分裂无效的原因: 你的分裂需要逃避这段时间。你分裂了每个角色,这意味着没有捕获。运行此脚本以便自己查看。

    -1/0/1