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.4package-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;
}
于 2012-09-08T01:14:18.120 に答える
0

変数に同じフォーマットが含まれている場合は、文字列の数字を削除して結果を比較してみてください。

于 2012-09-07T22:06:13.213 に答える