我想比较来自 2 个不同文件的两行。但我想忽略以“SubmissionTime:”开头并以“execEndTime:”结尾的任何部分。例如
如果
$line1="TestSubmissionTime123execEndTime"
$line2="TestSubmissionTime1234567789012131231execEndtime"
这两条线应该相等。因此在 submitTime 和 execEndTime 之间可能存在可变数据量。我怎样才能做到这一点?
我想比较来自 2 个不同文件的两行。但我想忽略以“SubmissionTime:”开头并以“execEndTime:”结尾的任何部分。例如
如果
$line1="TestSubmissionTime123execEndTime"
$line2="TestSubmissionTime1234567789012131231execEndtime"
这两条线应该相等。因此在 submitTime 和 execEndTime 之间可能存在可变数据量。我怎样才能做到这一点?
好吧,从技术上讲,您可以通过以下方式轻松地从字符串中删除不需要的数据:
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 部分的字符串。
尝试在 submitTime 和 execEndTime 之间替换任何内容,然后进行比较。例如:
my $line1 = "TestSubmissionTime123execEndTime";
my $line2 = "TestSubmissionTime1234567789012131231execEndTime";
$line1 =~ s/TestSubmissionTime.*execEndtime//;
$line2 =~ s/TestSubmissionTime.*execEndTime//;
if $line1 eq $line2 {...}
听起来像一个子程序的好工作:
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) 修饰符,因为您的示例字符串同时包含Endtime
and EndTime
,并且您说它们应该相等。如果这是一个错字,并且大小写很重要,请删除/i
. 我使用 global/g
修饰符来删除这些字符串的所有出现。
原始字符串不会被更改。