小例子: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"