繁体   English   中英

比较 Perl 中的 3 位点分隔数字与 >3 位和字母数字

[英]Compare 3 digit dot separated number with >3 digit and alphanumeric in Perl

任何人都可以帮助在 Perl 中执行以下操作吗?

  1. 从文件中读取一组数字或字符(例如 2021.2.3.0 / 2.8.1 / 2021.3.1_alpha )。
  2. 将其与数字 2.4.0 进行比较。 (总是相同的数字)如果更大或更小。
  3. 例如:(2.4.0 < 2021.2.3.0) --> 这是错误的。 所以什么也不做。
  4. if (2.4.0 > 2.3.0) --> True - 所以做一些操作。
  5. 对于用点分隔的 3 位数字,我们可以这样做。 (实际上我们正在做)。
  6. 但是如何比较超过 3 位的数字和字母数字。

在这里我需要始终与 2.4.0 进行比较。 谁能指导我如何在 Perl 中执行此操作?

我现有的代码如下:

use strict;
use warnings;
my $path_ice = $ARGV[0];
my $filename = ($#ARGV == 0) ?  $ARGV[0]."\\medc17_tools.ini" : $ARGV[1];
my $flag = 0;
my $buld_ver = "";
my @buld_very = "";
my $status = 55;
if (open(my $fh, '<:encoding(UTF-8)', $filename))
 {
 while (my $line = <$fh>)
   {
   chomp $line;
   if($line=~m/^PRJ_BUILD_NAME=mdgb/) {$flag = 1;}
   if($line=~m/^PRJ_BUILD_VERSION=/)
     {
     @buld_very = split('=',$line);
     $buld_ver = substr($buld_very[1], 0, 5);
     $buld_ver =~ tr/.//d;
     if ($buld_ver < 240 ) {$status = 44;}
     last;
     }
   }
} 
else {
      warn "Could not open file '$filename' $!";
    }
if ($flag == 1)
{
exit(1);
}
else
   {
   exit(0);
    }

在这里,我们将点分隔转换为整数并进行比较。 它适用于 3 位数的值。 但不知道如何处理字母数字和 >3 位点分隔数字。

有什么帮助吗?

您列出的格式完全受version支持。

use version qw( );

my $build_ver = ...;

$build_ver = version->declare( $build_ver );

if ( $build_version >= version->declare("2.4.0") ) {
   ...
} else {
   ...
}

对于同时包含数字和非数字字符串的版本,一种工具是Sort::Versions

use Sort::Versions;

my @sorted versions = 
    sort { versioncmp($a, $b) } 
        qw( 2021.2.3.0  2.8.1  2021.3.1_alpha );

或者单独比较

if (versioncmp('2.4.0', '2021.2.3.0') == -1) { ... }  # first is "lesser"

标准是

...这两个字符串被视为由句点或连字符分隔的子单元。 每个子单元可以包含任意数量的数字组或非数字组。 如果在两侧比较数字组,则使用数字比较,否则使用 ASCII 排序。 如果所有比较都相等,则具有更多单位的组或子组将获胜。 句点比连字符更紧密地将数字组绑定在一起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM