0

2 つの異なるファイルの 2 つの行を比較したいと思います。ただし、「SubmissionTime:」という単語で始まり、「execEndTime:」という単語で終わる行のセクションは無視したいと思います。たとえば、

もしも

$line1="TestSubmissionTime123execEndTime"  
$line2="TestSubmissionTime1234567789012131231execEndtime" 

これらの 2 行は等しくなければなりません。そのため、submissionTime と execEndTime の間に可変量のデータが存在する可能性があります。どうすればこれを達成できますか?

4

3 に答える 3

1

技術的には、次のような方法で文字列から不要なデータを簡単に削除できます。

sub compare_by_my_rules {
  my ($line1, $line2) = @_;
  $line1 =~ s/(?<=SubmissionTime).+?(?=execEndTime)//g;
  $line2 =~ s/(?<=SubmissionTime).+?(?=execEndTime)//g;
  return $line1 cmp $line2;
}

lookbehindつまり、このルーチンに渡された文字列は、'SubmissionTime'lookaheadと 'execEndTime' のルックアラウンドを使用して問題のあるセクションが削除され、比較されます。しかし実際には、次のようにしてブロック全体を削除できます。

  =~ s/SubmissionTime.*?execEndTime//g;

...これらのマーカーは等しい運命にあり、比較にはまったく影響しないためです。

.*?複数の SubmissionTime セクションを持つ文字列を処理するために使用されます。

于 2012-07-09T15:42:43.613 に答える
0

サブルーチンにとっては良い仕事のように聞こえます:

use strict;
use warnings;

my $line1="TestSubmissionTime123execEndTime"; 
my $line2="TestSubmissionTime1234567789012131231execEndtime" ;

print comp($line1, $line2) ? "Same" : "Not same";

sub comp {
    my ($str, $cmp) = @_;
    $str =~ s/SubmissionTime.*?execEndTime//ig;
    $cmp =~ s/SubmissionTime.*?execEndTime//ig;
    return ($str eq $cmp);
}

サンプル文字列にはとの/i両方が含まれているため、(大文字と小文字を区別しない)修飾子を使用しました。これがタイプミスであり、大文字と小文字が重要な場合は、を削除してください。グローバル修飾子を使用して、これらの文字列のすべての出現箇所を削除しました。EndtimeEndTime/i/g

元の文字列は変更されません。

于 2012-07-09T15:59:26.090 に答える
0

submitTime と execEndTime の間に何かを代入して比較してみてください。例えば:

my $line1 = "TestSubmissionTime123execEndTime";
my $line2 = "TestSubmissionTime1234567789012131231execEndTime";

$line1 =~ s/TestSubmissionTime.*execEndtime//;
$line2 =~ s/TestSubmissionTime.*execEndTime//;
if $line1 eq $line2 {...}
于 2012-07-09T15:45:17.203 に答える