在同一行上匹配子串

时间:2012-10-08 05:40:34

标签: perl

我有一个看起来像这样的文件:

a_12_3_5- k_3_4_6-a_12_3_5-
q_1_5_7_9- q_1_5_7_9-
a_9_4_5-c_3_4_6- c_3_4_6-r_4_5_7-
b_1_1_3- v_1_5_7-
d_12_4_5-e_4_5_6- g_5_6_7-d_6_8_6-
b_1_1_7-f_3_8_7_8-d_4_1_4- d_4_1_5-b_1_1_7-f_3_8_3
b_1_1_7-f_3_8_7_8-d_4_1_4- e_3_3_1-f_3_8_7-f_21_3_1-b_1_1_7-a_1_1_1-

这是一个以空格分隔的文件。在空格之前和之后出现的字符串由较小的子字符串组成,即b_1_1_3-,k_3_4_6-,b_12_4_5-等。我必须检查空间左侧有多少较小的子字符串包含在出现的字符串中空间的右侧。 例如:第一行的子字符串a_12_3_5-存在于右侧的字符串中。第二行显示与右侧完全匹配。然而,第3行显示左侧只有一个子串(c_3_4_6-),它包含在右侧的字符串中。第4行和第5行表示在右侧的字符串中不包含左侧子串的情况。下一行显示右侧的字符串中只包含一个子字符串(b_1_1_7-)。最后一行显示有2个子串b_1_1_7-和f_3_8_7-包含在右侧的字符串中。 因此,有效地,我想看看左侧有多少个子串包含在右侧的字符串中。我试图以下面的方式获取输出,这样我的文件中的每一行都附加了三个数字,即左侧的子串数,右侧的子串数,左侧的子串数,包含在右边。

a_12_3_5- k_3_4_6-a_12_3_5- 1 2 1 
q_1_5_7_9- q_1_5_7_9- 1 1 1
a_9_4_5-c_3_4_6- c_3_4_6-r_4_5_7- 2 2 1
b_1_1_3- v_1_5_7- 1 1 0
d_12_4_5-e_4_5_6- g_5_6_7-d_6_8_6- 2 2 0
b_1_1_7-f_3_8_7_8-d_4_1_4- d_4_1_5-b_1_1_7-f_3_8_3- 3 3 1
b_1_1_7-f_3_8_7_8-d_4_1_4- e_3_3_1-f_3_8_7-f_21_3_1-b_1_1_7-a_1_1_1- 3 5 2

到目前为止,我已经能够获得上述输出,但似乎无法达到该行的最后部分。我尝试过使用perl pos和index函数。 请帮忙。

1 个答案:

答案 0 :(得分:0)

请尝试使用此perl代码。

#!/usr/bin/perl
use warnings;
use strict;

while ( <DATA> ) {
    my $line = $_;
    chomp $line;
    my ( $left, $right ) = split / /, $line;
    #print "$left\n\t$right\n";
    my @lefts = split /-/, $left;
    my @rights = split /-/, $right;
    my $total = 0;
    foreach ( @rights ) {
        $total++ if $left =~ /$_/;
    }
    print $line, " ", scalar @lefts, " ", scalar @rights, " ", $total, "\n";
}

__DATA__
a_12_3_5- k_3_4_6-a_12_3_5-
q_1_5_7_9- q_1_5_7_9-
a_9_4_5-c_3_4_6- c_3_4_6-r_4_5_7-
b_1_1_3- v_1_5_7-
d_12_4_5-e_4_5_6- g_5_6_7-d_6_8_6-
b_1_1_7-f_3_8_7_8-d_4_1_4- d_4_1_5-b_1_1_7-f_3_8_3
b_1_1_7-f_3_8_7_8-d_4_1_4- e_3_3_1-f_3_8_7-f_21_3_1-b_1_1_7-a_1_1_1-