【问题标题】:Help understanding global flag in perl帮助理解 perl 中的全局标志
【发布时间】:2011-08-07 09:21:26
【问题描述】:

据我所知,在 perl 中全局 '/g' 标志意味着搜索将替换/返回整个字符串中的所有匹配项。但是我无法理解它在匹配时对全局变量的反应方式,有人可以解释为什么这两个示例程序的输出之间存在差异:

版本 1:

my $text = 'This is sample float value 3.2 ';

getFloat();
getFloat();

sub getFloat(){
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/is){
        print "matched> $1$2$3 ";
    }
}

输出: 匹配> 3.2 匹配> 3.2

版本 2:(带全局标志)

my $text = 'This is sample float value 3.2 ';

getFloat();
getFloat();

sub getFloat(){
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/gis){
        print "matched> $1$2$3 ";
    }
}

输出: 匹配> 3.2

从输出中可以看出,与全局标志匹配只发生一次。有人可以解释这种行为吗?

【问题讨论】:

  • 你应该看看perldoc perlretut
  • 您期待什么?你想让它一直匹配直到它不匹配?那不是意味着if 条件总是错误的。简而言之,if (/.../g) 毫无意义。

标签: regex perl


【解决方案1】:

使用g 修饰符,字符串会记住其最后一次匹配的位置,因此您可以在while 循环中请求与g 匹配并查找所有匹配项。

没有g,您每次都从头开始,总能找到第一个匹配项。

在您的情况下,使用 g,您第一次匹配 3.2,但第二次尝试匹配时,没有更多匹配项。

没有g,您可以调用getFloat() 无数次,您总能找到第一个匹配项。

【讨论】:

    【解决方案2】:

    在列表上下文中使用时,/g 会导致 =~ 返回所有匹配项。在标量上下文中使用时,/g 会导致 =~ 在每次使用时返回一个匹配项,然后在没有更多匹配项时失败(返回 undef),然后从字符串的开头重新开始。 (您可以使用/gc 来防止这种情况。)您还可以使用pos($text) 函数来查找或设置开始匹配的位置。

    没有/g=~ 每次总是返回相同的匹配。这相当于每次将pos($text) 设置为undef。 (在列表上下文中,=~ 改为返回捕获列表。)

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2011-07-16
      • 2023-03-26
      • 1970-01-01
      • 2016-07-08
      • 2016-04-01
      • 1970-01-01
      • 2015-08-22
      • 2011-03-25
      相关资源
      最近更新 更多