我有这个文本(原始文本的缩短版本):
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?
答案 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
旁边)。
在测试时,我复制了'''来自此处的输入,即我将所有字符都放在一行中。如果您的输入不同,请使用代码格式,而不是引用。