13

小さな例:

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は何の助けにもなりませんでした(または私はそれを見つけることができませんでした)。

4

1 に答える 1

16

s///スカラーコンテキストで行われた置換の数を返します。perlopから(強調が追加されました):

s / PATTERN / REPLACEMENT / msixpogce
文字列でパターンを検索し、見つかった場合は、そのパターンを置換テキストに置き換えて、行われた置換の数を返します。それ以外の場合は、false(具体的には空の文字列)を返します。

s///あなたの問題は、スカラーコンテキストで呼び出さなかったことです。リストコンテキストで呼び出してから、スカラーコンテキストで(空のリストへの)割り当てを評価しました。スカラーコンテキストでのリスト代入は、式の右辺によって生成された要素の数を返します。s///(リストとスカラーの両方のコンテキストで)単一の値を返すため、何もしなかった場合でも、要素の数は常に1になります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"
于 2010-06-23T16:10:31.617 に答える