是否有Perl快捷方式来计算字符串中的匹配数?

Geo*_*Geo 75 regex arrays perl perl4

假设我有:

my $string = "one.two.three.four";
Run Code Online (Sandbox Code Playgroud)

我应该如何使用上下文来获得模式找到匹配的次数(3)?这可以使用单线程来完成吗?

我试过这个:

my ($number) = scalar($string=~/\./gi);
Run Code Online (Sandbox Code Playgroud)

我认为通过括号括起来$number,我会强制数组上下文,并且通过使用scalar,我得到了计数.但是,我得到的只是1.

fri*_*edo 112

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

 my $number = () = $string =~ /\./gi;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,perlsecret确实提出"土星"作为替代名称.:) (3认同)

Rob*_*t P 32

我认为描述这个的最明确的方法是避免即时转换为标量.首先分配给一个数组,然后在标量上下文中使用该数组.这基本上就是= () =成语会做什么,但没有(很少使用)成语:

my $string = "one.two.three.four";
my @count = $string =~ /\./g;
print scalar @count;
Run Code Online (Sandbox Code Playgroud)

  • 对于最直接的方式+1,goatse运算符是可怕的. (13认同)
  • 不过,`@count` 周围的括号是不必要的。 (3认同)

Rob*_*t P 20

另外,请参阅Perlfaq4:

有许多方法,效率各不相同.如果你想在字符串中计算某个单个字符(X),你可以像这样使用tr ///函数:

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

如果您只是寻找单个角色,这很好.但是,如果您尝试计算较大字符串中的多个字符子串,则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";
Run Code Online (Sandbox Code Playgroud)

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

$count = () = $string =~ /-\d+/g;
Run Code Online (Sandbox Code Playgroud)


Mik*_*ke 7

以下代码是单行吗?

print $string =~ s/\./\./g;
Run Code Online (Sandbox Code Playgroud)


PP.*_*PP. 6

试试这个:


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

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

  • 您不需要任何这些括号. (4认同)