Perl s///g 中发生了多少次替换?

发布于 2024-09-06 10:35:38 字数 410 浏览 3 评论 0原文

小例子:

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

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

perlre、perlvar 和 perlop 没有提供任何帮助(或者我只是找不到它)。

Small example:

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

3
aaabbcc

whereas perl -e '$s="aaabbcc";$c=()=$s=~s/a/x/g;print"$c\n$s\n"' (s///g) outputs

1
xxxbbcc

I'd like to do both things at once without having to match first: substitute and know the number of substitutions. Obviously a s///g does not return the number of substitutions in scalar context--unlike m//g does with matches. Is this possible? If yes, how?

perlre, perlvar and perlop provided no help (or I just couldn't find it).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苍景流年 2024-09-13 10:35:38

s/// 确实返回标量上下文中进行的替换数。来自 perlop (添加了强调):

s/PATTERN/REPLACMENT/msixpogce
在字符串中搜索模式,如果找到,则替换该模式
带有替换文本的模式,返回的数量
进行了替换
。否则返回 false(具体来说,
空字符串)。

您的问题是您没有在标量上下文中调用 s/// 。您在列表上下文中调用它,然后在标量上下文中评估分配(到空列表)。标量上下文中的列表赋值返回表达式右侧生成的元素数。由于 s/// 返回单个值(在列表和标量上下文中),因此即使 s/// 没有执行任何操作,元素数量也始终为 1 。

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"

s/// does return the number of substitutions made in scalar context. From perlop (emphasis added):

s/PATTERN/REPLACEMENT/msixpogce
Searches a string for a pattern, and if found, replaces that
pattern with the replacement text and returns the number of
substitutions made
. Otherwise it returns false (specifically,
the empty string).

Your problem is that you didn't call s/// in scalar context. You called it in list context and then evaluated the assignment (to an empty list) in scalar context. A list assignment in scalar context returns the number of elements produced by the right-hand side of the expression. Since s/// returns a single value (in both list and scalar context) the number of elements is always one even if the s/// didn't do anything.

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

To call s/// in scalar context, omit the =()= pseudo-operator.

perl -E "$s='aaabbcc'; $c=$s=~s/a/x/g; say qq'$c-$s'"  # prints "3-xxxbbcc"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文