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

时间:2013-08-02 16:32:56

标签: 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";
}

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

2 个答案:

答案 0 :(得分:9)

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

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

@matches = $saved_string =~ /abc/g;
if ( @matches == 3 ) {

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

while ( my ($key, $value) = each %hash ) {

所以你可以这样做:

if ( 3 == ( @matches = $saved_string =~ /abc/g ) ) {

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

答案 1 :(得分:3)

将匹配保存到anon数组引用,使用@{}取消引用并与数字进行比较,

if( @{[ $saved_string =~ /abc/g ]} == 3) {
  print "abc was found in the saved string exactly 3 times";
}