小例子:
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没有提供帮助(或者我只是找不到它)。

最佳答案

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



您的问题是您没有在标量上下文中调用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"

10-04 11:45