Perl正则表达式解释

时间:2015-08-04 22:22:42

标签: regex perl match

我希望得到一些解释,我有以下脚本:

open (FILE, '2.txt');
@DNA = <FILE>;
$DNA = join ('', @DNA);

print "DNA = ". $DNA . "\n";

$a=0;
while ($DNA =~ //ig) {$a++;}
print "Total characters = ".$a."\n";

$b=0;
while ($DNA =~ /fl/ig) {$b++;}
print "Total fl = ".$b."\n";

$c=0;
while ($DNA =~ /[^fl]/ig) {$c++;}
print "Total character less fl = ".$c."\n";

exit;

文本文档“2.txt”包含以下字符:

flkkkklllkkfewnofnewofewfl

当我运行脚本时,我得到以下输出:

DNA = flkkkklllkkfewnofnewofewfl
Total characters = 27
Total fl = 2
Total character less fl = 16

我的问题是,为什么我这样做 while ($DNA =~ /fl/ig) {$b++;}如果统计了fl的所有实例,

但是当我这样做的时候 while ($DNA =~ /[^fl]/ig) {$c++;}它计算了字符数 既不是f或l(即f&amp; l分别处理)。

我一直在寻找脚本来计算不是fl(即一起对待)的字符数

2 个答案:

答案 0 :(得分:2)

[fl]是一个字符类,意思是 f l
它并不意味着子串fl

所以[^fl]计算所有不是f或l的字符。

但是,你可以用这样的正则表达式来做到这一点 -

/[^fl]|f(?!l)|(?<!f)l/

格式化:

    [^fl]          # Not f nor l
 |  f (?! l )      # f not followed by l
 |  (?<! f ) l     # l not following f

答案 1 :(得分:0)

保持简单,可以考虑首先删除所有“fl”的实例,然后简单地计算剩余的字符:

$DNA =~ s/fl//g;
print "Total characters less fl = ".length($DNA)."\n";