总结:
如果使用全局修饰符/g,那么下次匹配会从上次匹配的中止位置开始;而不是从0开始;
所以在做if筛选条件【if(base2=~/TACG/ )】的时候最好不要加/g;这时候pos($base)一直是空值,当在这个语句块中需要匹配位置的时候再加/g,
if($base1=~/ATCG/ || $base2=~/TACG/){
pos($base1); #此时为空值
pos($base2); #此时为空值
if($base1=~/ATCG/g){
pos($base1); # 此时返回正常位置值;
}
}
在 Perl 中,如果对一个字符串使用 /g 修饰符进行全局匹配,则 pos 函数会在匹配时记录上一次匹配结束的位置,并在下一次匹配时从该位置开始继续匹配。但是,如果没有使用 /g 修饰符,则 pos 函数不会记录匹配结束的位置,而是始终返回 0。
因此,对于连续两次同样的匹配,如 r/ 后再接一个 r/,如果没有使用 /g 修饰符,则 pos(seq2) 的值重置为 0。例如:
my $seq2 = "ACCTTGAGGT";
my $r = "G";
# 第一次匹配
if ($seq2 =~ /$r/) {
print "Matched at position ", pos($seq2), "\n";
}
# 第二次匹配
pos($seq2) = 0; # 重置匹配的起始位置
if ($seq2 =~ /$r/) {
print "Matched at position ", pos($seq2), "\n";
}
在上述代码中,对字符串 seq2) 的值重置为 0,以使其从字符串的起始位置开始匹配。