我想比较来自2个不同文件的两行。但我想忽略以“SubmissionTime:”开头的行的任何部分,并以“execEndTime:”结尾。例如
如果
$line1="TestSubmissionTime123execEndTime"
$line2="TestSubmissionTime1234567789012131231execEndtime"
这两行应该相等。所以在submissionTime和execEndTime之间可能存在可变数量的数据。我怎么能做到这一点?
答案 0 :(得分:1)
从技术上讲,您可以通过以下方式轻松删除字符串中不需要的数据:
sub compare_by_my_rules {
my ($line1, $line2) = @_;
$line1 =~ s/(?<=SubmissionTime).+?(?=execEndTime)//g;
$line2 =~ s/(?<=SubmissionTime).+?(?=execEndTime)//g;
return $line1 cmp $line2;
}
换句话说,传递到此例程中的字符串使用lookarounds删除了其违规部分 - lookbehind
表示“SubmissionTime”,lookahead
表示“execEndTime” - 然后进行比较。但实际上你可以用以下内容删除整个块:
=~ s/SubmissionTime.*?execEndTime//g;
......因为这些标记注定是相同的,并且根本不会影响比较。
.*?
用于处理具有多个SubmissionTime部分的字符串。
答案 1 :(得分:0)
尝试在submissionTime和execEndTime之间替换任何内容然后进行比较。例如:
my $line1 = "TestSubmissionTime123execEndTime";
my $line2 = "TestSubmissionTime1234567789012131231execEndTime";
$line1 =~ s/TestSubmissionTime.*execEndtime//;
$line2 =~ s/TestSubmissionTime.*execEndTime//;
if $line1 eq $line2 {...}
答案 2 :(得分: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
(忽略大小写)修饰符,因为您的示例字符串包含Endtime
和EndTime
,并且您说它们应该相等。如果这是拼写错误,并且案例很重要,请删除/i
。我使用全局/g
修饰符来删除所有这些字符串。
原始字符串不会被更改。