1

我有 2 个变量:

my $var1 = 'package-name-1.4';
my $var2 = 'package-name-1.5';

我想要做的是比较 $var1 和 $var2,同时排除数字。

我在网上查看并尝试了正则表达式,但我无法让它工作,我非常感谢一些帮助。

我的想法如下:

if (removeNumbers($var1) =~ removeNumbers($var2))

这样结果就像比较:package-name- 与 package-name-,从而评估为 true。

在此先感谢您的帮助!

4

3 回答 3

5

好吧,最简单的方法就是完全删除所有数字:

sub remove_numbers {
  my ($orig) = @_;
  $orig =~ s/\d+//g;
  return $orig;
}

但这有点幼稚:例如,some-package-1.4.1并且some-package-1.4不相等。最好也删除点,但前提是它们跟随数字(用作分隔符)。

  $orig =~ s/\d+[.]?//g;

更重要的是,也许数字之前的第一个连字符也应该去(所以 'package-name' 和 'package-name-1' (甚至 'package-name-1.0-some-fancy-line' 和 'package-name -some-fancy-line') 将被视为相同:

  $orig =~ s/-?\d+[.]?//g;  

更新:然而,有不止一种方法可以做到:

  $orig = substr $orig, 0, rindex $orig, '-';

如果所有字符串都具有相同的格式(版本号始终位于字符串的末尾,始终跟在最后一个连字符后面,它始终存在),则适用:

使用如下:

if (remove_numbers($var1) eq remove_numbers($var2))
于 2012-09-07T22:03:36.870 回答
3

在这种情况下,最好简单地提取所有“单词”(此处指字母字符串)并比较仅包含这些单词的字符串

例如

sub words_only {
  join ' ', shift =~ /\b[a-z]+\b/ig;
}

会同时变成package-name-1.4和,所以这个脚本可以正确打印package-name-1.5package nameMATCH

use strict;
use warnings;

my $var1 = 'package-name-1.4';
my $var2 = 'package-name-1.5';

print words_only($var1) eq words_only($var2) ? 'MATCH' : 'NO MATCH';

sub words_only {
  join ' ', shift =~ /\b[a-z]+\b/ig;
}
于 2012-09-08T01:14:18.120 回答
0

如果您的变量包含相同的格式,那么您可以尝试删除字符串中的数字并比较结果。

于 2012-09-07T22:06:13.213 回答