有一个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;