代码之家  ›  专栏  ›  技术社区  ›  musiKk

一个perl s//g中发生了多少次替换?

  •  10
  • musiKk  · 技术社区  · 14 年前

    小例子:

    perl -e '$s="aaabbcc";$c=()=$s=~/a/g;print"$c\n$s\n"' (m/g)输出

    3
    aaabbcc
    

    反之 perl -e '$s="aaabbcc";$c=()=$s=~s/a/x/g;print"$c\n$s\n"' (S//G)输出

    1
    xxxbbcc
    

    我想同时做这两件事而不必先匹配:替换并知道替换的数量。显然,S///G不会返回标量上下文中替换的数量——与M//G使用匹配项时不同。这有可能吗?如果是,怎么办?

    Perlre、Perlvar和Perlop没有提供任何帮助(或者我只是找不到)。

    1 回复  |  直到 12 年前
        1
  •  14
  •   Michael Carman    14 年前

    s/// 不返回在标量上下文中进行的替换数。从 perlop (增加了重点):

    S/pattern/replacement/msixpogce
    在字符串中搜索模式,如果找到,则替换该模式 带替换文本的图案和 返回 替换 . 否则它返回错误(具体来说, 空字符串)。

    你的问题是你没有打电话 S/// 在标量上下文中。您在列表上下文中调用它,然后评估 分配 (到空列表)在标量上下文中。标量上下文中的列表赋值返回表达式右侧生成的元素数。自从 S/// 返回单个值(在列表和标量上下文中),元素数始终为一,即使 S/// 什么都没做。

    perl -E "$s='aaabbcc'; $c=()=$s=~s/x/y/g; say qq'$c-$s'"  # prints "1-aaabbcc"
    

    打电话 S/// 在标量上下文中,省略 =()= 伪运算符。

    perl -E "$s='aaabbcc'; $c=$s=~s/a/x/g; say qq'$c-$s'"  # prints "3-xxxbbcc"