有一个Perl快捷方式来计算一个string中匹配的数量吗?

假设我有:

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

我应该如何玩上下文来获得模式匹配次数(3)? 这可以用一个class轮完成吗?

我试过这个:

 my ($number) = scalar($string=~/\./gi); 

我认为,通过在$number周围放置括号,我会强制数组上下文,并通过使用scalar ,我会得到计数。 但是,我得到的是1

这使得正则expression式本身处于标量的背景下,这不是你想要的。 相反,将正则expression式放在列表上下文中(以获得匹配的数量)并将放入标量上下文中。

  my $number = () = $string =~ /\./gi; 

我认为最明确的描述方法是避免即刻投入标量。 首先分配给一个数组,然后在标量上下文中使用该数组。 这基本上就是= () =习语所能做的,但是没有(很less使用)的习惯用法:

 my $string = "one.two.three.four"; my @count = $string =~ /\./g; print scalar @count; 

另请参阅Perlfaq4 :

有很多方法,效率各不相同。 如果你想要一个string中的某个单个字符(X)的计数,你可以像这样使用tr ///函数:

 $string = "ThisXlineXhasXsomeXx'sXinXit"; $count = ($string =~ tr/X//); print "There are $count X characters in the string"; 

这很好,如果你只是在寻找一个单一的字符。 但是,如果您要在较大的string中计数多个字符子string,tr ///将不起作用。 你可以做的是围绕一个全局模式匹配包装while()循环。 例如,我们来计算负整数:

 $string = "-9 55 48 -2 23 -76 4 14 -44"; while ($string =~ /-\d+/g) { $count++ } print "There are $count negative numbers in the string"; 

另一个版本在列表上下文中使用全局匹配,然后将结果分配给标量,产生匹配数的计数。

 $count = () = $string =~ /-\d+/g; 

尝试这个:

 my $string = "one.two.three.four"; my ($number) = scalar( @{[ $string=~/\./gi ]} ); 

它返回给我3 。 通过创build对数组的引用,在列表上下文中计算正则expression式,并且@{..}取消引用数组引用。

下面的代码是单行的吗?

 print $string =~ s/\./\./g; 

其他方式,

 my $string = "one.two.three.four"; @s = split /\./,$string; print scalar @s - 1; 

我能够减less在friedo的方法中的语法,同时达到相同的结果…

 my ($matchcount) = $text =~ s/$findregex/ /gi;