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



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

MYTEXT.txtBAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASBHJASCXZBUYTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZCZPZHCUIHAUISHCI Ujxzjcbzyausghdyuagwebwhbhjasbhjasbhjascxzbuyhabsdauszxhjbrrrrrrrjfuabgafgllpkwaacaaabzjhxzxhjbjhxzxxzcxccxzucagsajijicxzijuauuisusjussjsjsjajcxzxcztttttrjfuabgafglopkwabcaaaabbu

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

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 "@matchesn";
my $filename = 'results_matches.txt';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh "@matchesn";
close $fh;
print "donen";

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

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 "@matchesn";

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

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

我已经遵循了本主题中的答案,但无法让其中任何一个工作:如何在 Perl 中找到与正则表达式的所有匹配项?

通过使用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而不是$&,因为$&对你在程序中所做的所有匹配都施加了性能;并删除了/g并将g添加到正确的位置(即在}x旁边)。

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

最新更新