行/字符串比较忽略可变长度的字符串的某些部分与Perl中的特征开始和结束字

时间:2012-07-09 15:36:11

标签: perl comparison line

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

如果

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

这两行应该相等。所以在submissionTime和execEndTime之间可能存在可变数量的数据。我怎么能做到这一点?

3 个答案:

答案 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(忽略大小写)修饰符,因为您的示例字符串包含EndtimeEndTime,并且您说它们应该相等。如果这是拼写错误,并且案例很重要,请删除/i。我使用全局/g修饰符来删除所有这些字符串。

原始字符串不会被更改。