Is there a Perl shortcut to count the number of matches in a string?

前端 未结 9 891
生来不讨喜
生来不讨喜 2020-12-01 00:54

Suppose I have:

my $string = \"one.two.three.four\";

How should I play with context to get the number of times the pattern found a match (3

9条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-01 01:38

    I noticed that if you have an OR condition in your regular expression (eg /(K..K)|(V.AK)/gi ) then the array produced may have undefined elements which are included in the count at the end.

    For example:

    my $seq = "TSYCSKSNKRCRRKYGDDDDWWRSQYTTYCSCYTGKSGKTKGGDSCDAYYEAYGKSGKTKGGRNNR";
    my $regex = '(K..K)|(V.AK)';
    my $count = () = $seq =~ /$regex/gi;
    print "$count\n";
    

    Gives a value of count of 6.

    I found the solution in this post How do I remove all undefs from array?

    my $seq = "TSYCSKSNKRCRRKYGDDDDWWRSQYTTYCSCYTGKSGKTKGGDSCDAYYEAYGKSGKTKGGRNNR";
    my $regex = '(K..K)|(V.AK)';
    my @count = $seq =~ /$regex/gi;
    @count = grep defined, @count; 
    my $count = scalar @count;
    print "$count\n";
    

    Which then gives the correct answer of three.

提交回复
热议问题