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

Why is Perl not printing all regex matches in a multi-line regex?

我有这段文字(我的原文的缩略版):

mytext.txt BAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYTRTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXHJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYHABSDAUSZXHJBRRRRRRJFUABGAFGLLPKWAACAAAABBZJHXZXHJBJHXZXHJBJHXJBJHXZCXZCCZCXZUCAGSAJIJICXZIJUAUUISUSJUSSJSJSJAJCXZXCZTTTTTRJFUABGAFGLOPKWABCAAAABBU

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

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

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

print "@matches\n";

我有以下代码,它只成功打印出一个(第一个)结果。但是它无法打印所有匹配项。

if (<text> =~ m{
    ([TR]{6}
    JFUA
    [ABR]{1}
    GAFG
    ( [LOP]{2,3} )
    [KW]{2,5}
    (??{  =~ tr/LOP/ABC/r })
    AAAABB[UXZ]{1})
}x) {print "\n";}

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

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

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

我还删除了 {1},因为它没用,使用 $1 而不是 $&,因为 $& 对您在程序中所做的所有匹配施加了不利的性能;并删除 /g 并将 g 添加到正确的位置(即 }x 旁边)。

测试时,我从这里复制'n'粘贴输入,即所有字符都在一行中。如果您的输入不同,请使用它的代码格式,而不是引用。