如何编写一个perl if语句来测试使用正则表达式找到字符串的次数?

jak*_*115 3 regex perl

我正在尝试编写一个包含if语句的perl脚本,我希望这个if语句检查在保存的字符串中是否通过正则表达式找到了一定数量的字符串.如果可能的话,我想在一行中做到这一点,想象如下:

$saved_string = "This abc is my abc test abc";
if( #something_to_denote_counting ($saved_string =~ /abc/) == 3)
{
    print "abc was found in the saved string exactly 3 times";
}
else
{
    print "abc wasn't found exactly 3 times";
}
Run Code Online (Sandbox Code Playgroud)

...但我不知道我需要做什么来if检查正则表达式匹配的次数.有人可以告诉我这是否可能?谢谢!

yst*_*sth 9

if ( 3 == ( () = $saved_string =~ /abc/g ) ) {
    print "abc was found in the saved string exactly 3 times";
}
Run Code Online (Sandbox Code Playgroud)

要获得计数,您需要在列表上下文中使用/ g.所以你可以这样做:

@matches = $saved_string =~ /abc/g;
if ( @matches == 3 ) {
Run Code Online (Sandbox Code Playgroud)

但perl提供了一些帮助,使其更容易; 列表赋值放置在标量上下文中(例如由提供者提供==),返回赋值右侧的元素计数.这使代码如下:

while ( my ($key, $value) = each %hash ) {
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

if ( 3 == ( @matches = $saved_string =~ /abc/g ) ) {
Run Code Online (Sandbox Code Playgroud)

但是甚至不需要使用数组; 分配到一个空列表就足够了(并且只要你需要在列表上下文中执行代码但只获得结果计数,它就成了一个习惯用法).

  • @ jake9115,详细地说,`()`是占位符,强制以下赋值为列表赋值运算符.列表赋值运算符在列表上下文中计算其操作数,并在标量上下文中使用时返回其右侧返回的事物数.请参阅[Mini-Tutorial:Scalar vs List Assignment Operator](http://www.perlmonks.org/?node_id=790129). (3认同)