0

我想比较来自 2 个不同文件的两行。但我想忽略以“SubmissionTime:”开头并以“execEndTime:”结尾的任何部分。例如

如果

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

这两条线应该相等。因此在 submitTime 和 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

尝试在 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 回答
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(ignore case) 修饰符,因为您的示例字符串同时包含Endtimeand EndTime,并且您说它们应该相等。如果这是一个错字,并且大小写很重要,请删除/i. 我使用 global/g修饰符来删除这些字符串的所有出现。

原始字符串不会被更改。

于 2012-07-09T15:59:26.090 回答