我有一个字符串
my $line = "MZEFSRGGRMEAZFE*MQZEFFMAEZF*"
我希望找到每一个以M
开头、以*
结尾的子字符串,并将其添加到一个数组中。这意味着以上字符串会在我的数组中生成6个元素。
以下是我的代码:
foreach ( $line =~ m/M.*?\*/g ) {
push @ORF, $_;
}
但是它只给了我两个元素,因为它忽略了重叠的字符串。
有没有办法获取所有匹配项?我尝试过谷歌搜索,但找不到答案。
#!/usr/bin/env perl
use strict;
use warnings;
my $line = "MZEFSRGGRMEAZFE*MQZEFFMAEZF*";
local our @match;
$line =~ m/(M.*\*)(?{ push @match, $1 })(*FAIL)/;
use Data::Dump;
dd @match;
输出:
(
"MZEFSRGGRMEAZFE*MQZEFFMAEZF*",
"MZEFSRGGRMEAZFE*",
"MEAZFE*MQZEFFMAEZF*",
"MEAZFE*",
"MQZEFFMAEZF*",
"MAEZF*",
)
use strict;
use warnings 'all';
use feature 'say';
my $line = 'MZEFSRGGRMEAZFE*MQZEFFMAEZF*';
my @orf;
{
my (@s, @e);
push @s, $-[0] while $line =~/M/g;
push @e, $+[0] while $line =~/\*/g;
for my $s ( @s ) {
for my $e ( @e ) {
push @orf, substr $line, $s, $e-$s if $e > $s;
}
}
}
say for @orf;
MZEFSRGGRMEAZFE*
MZEFSRGGRMEAZFE*MQZEFFMAEZF*
MEAZFE*
MEAZFE*MQZEFFMAEZF*
MQZEFFMAEZF*
MAEZF*
local our @match;
,否则如果放在被多次调用的子程序中,它将会失败。 - ikegami