我有两个变量:
my $var1 = 'package-name-1.4';
my $var2 = 'package-name-1.5';
我要做的是将$ var1与$ var2进行比较,同时排除数字。
我已经在网上看过并试过Regex,但是我无法让它工作,我非常感谢你的帮助。
我的想法如下:
if (removeNumbers($var1) =~ removeNumbers($var2))
这样结果就像比较:package-name-和package-name-,从而评估为true。
提前感谢您的帮助!
答案 0 :(得分: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))
答案 1 :(得分:3)
在这种情况下,最好只提取所有“单词”(这里是指字母字符串)并比较仅包含那些
的字符串。例如
sub words_only {
join ' ', shift =~ /\b[a-z]+\b/ig;
}
会将package-name-1.4
和package-name-1.5
都转换为package name
,因此此脚本会正确打印MATCH
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;
}
答案 2 :(得分:0)
如果您的变量包含相同的格式,那么您可以尝试删除字符串中的数字并比较结果。