3

我正在尝试编写一个包含 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 语句中做什么来检查正则表达式匹配的次数。有人可以告诉我这是否可能吗?谢谢!

4

2 回答 2

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 提供了一些帮助使它更容易;放置在标量上下文中的列表赋值(例如由 提供==)返回赋值右侧的元素计数。这启用了如下代码:

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

所以你可以这样做:

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

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

于 2013-08-02T16:34:24.817 回答
3

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

if( @{[ $saved_string =~ /abc/g ]} == 3) {
  print "abc was found in the saved string exactly 3 times";
}
于 2013-08-02T16:49:47.837 回答