【问题标题】:How many substitutions took place in a Perl s///g?Perl s///g 中发生了多少次替换?
【发布时间】:2010-06-23 16:00:20
【问题描述】:

小例子:

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

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

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

【问题讨论】:

  • 对于那些通过标题通过网络搜索找到该帖子但问题涉及磁盘上编辑文件的人:我发布了其他问题stackoverflow.com/questions/57411792/…,问题是输出需要定向到STDOUT

标签: regex perl substitution


【解决方案1】:

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

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

您的问题是您没有在标量上下文中调用s///。您在列表上下文中调用它,然后在标量上下文中评估 assignment(到一个空列表)。标量上下文中的列表赋值返回表达式右侧产生的元素数。由于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"

【讨论】:

  • 实际上,他并没有在标量上下文中评估列表。那是不可能的。他在标量上下文中评估了列表分配
  • @daotoad:谢谢,我知道这不太对,但这个术语让我一时不知所措。 Tangent:为什么不让更多人使用他们的编辑能力来修复这样的细节?
  • 我无法反思他人的动机,但我不会以任何改变意图或意义的方式编辑他人所写的内容。例如,有些人热衷于相信 Perl 中存在“标量上下文中的列表”,如果你是其中之一,我会非常冒犯你的话,否认你的(错误的和假定的)信念。在某些情况下,我的理解是错误的,更改帖子会导致错误。由于这些原因,我更愿意指出错误而不是“修复”它们。 YMMV
  • 在 Perl 标记下,已经修复了很多问题中的“错误”,这些问题会改变问题以便它自己回答。
  • @musikk,每个人都会遇到文档中有一个简单答案的问题而感到沮丧。如果您指的是 PP books.google.com/… 中的这一部分 - 那就是在谈论列表文字。列表文字实际上是一堆由中缀逗号运算符分隔的标量。在标量上下文中,逗号关联左侧并返回右侧,这意味着标量上下文中的列表文字计算为列表文字中的最后一项。请参阅perlmonks.org/?node_id=719099 进行激烈讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多