为什么Perl不能在多行正则表达式中打印所有正则表达式匹配?

时间:2017-11-15 08:47:33

标签: regex perl printing push tr

我有这个文本(原始文本的缩短版本):

  

mytext.txt   BAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYTRTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXHJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYHABSDAUSZXHJBRRRRRRJFUABGAFGLLPKWAACAAAABBZJHXZXHJBJHXZXHJBJHXJBJHXZCXZCCZCXZUCAGSAJIJICXZIJUAUUISUSJUSSJSJSJAJCXZXCZTTTTTRJFUABGAFGLOPKWABCAAAABBU

我的代码如下,打算打印所有匹配项,然后将它们保存到文件中。但我没有得到任何比赛,除了我原来的文件中至少有10个。

Embed

我还尝试了以下代码,但这也不起作用:

open(text, "<mytext.txt");

push (@matches,$&) while(<text> =~ m{
    ([TR]{6}
    JFUA
    [ABR]{1}
    GAFG
    ( [LOP]{2,3} )
    [KW]{2,5}
    (??{ $2 =~ tr/LOP/ABC/r })
    AAAABB[UXZ]{1})
    /g
}x);

print "@matches\n";

my $filename = 'results_matches.txt';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh "@matches\n";
close $fh;
print "done\n";

我有以下代码,只能成功打印出一个(第一个)结果。但它无法打印所有比赛。

my @matches = <text> =~ m{
        ([TR]{6}
        JFUA
        [ABR]{1}
        GAFG
        ( [LOP]{2,3} )
        [KW]{2,5}
        (??{ $2 =~ tr/LOP/ABC/r })
        AAAABB[UXZ]{1})
        /g
    }x;

print "@matches\n";

我已按照本主题中的答案进行操作,但未能使其中任何一个工作:How can I find all matches to a regular expression in Perl?

1 个答案:

答案 0 :(得分:1)

通过使用while <text>,您将在循环的每次迭代中从文件句柄中读取新文件。你需要循环,一个迭代遍历行,内循环迭代匹配。

while (my $line = <text>) {
    push @matches, $1 while $line
        =~ m{
            ([TR]{6}
            JFUA
            [ABR]
            GAFG
            ( [LOP]{2,3} )
            [KW]{2,5}
            (??{ $2 =~ tr/LOP/ABC/r })
            AAAABB[UXZ])
        }xg;
}

我也删除了{1},因为它没用,使用$ 1代替$&amp;因为$&amp;对你在节目中所做的所有匹配进行表现;并移除/g并将g添加到正确的位置(即}x旁边)。

在测试时,我复制了'''来自此处的输入,即我将所有字符都放在一行中。如果您的输入不同,请使用代码格式,而不是引用。