キャプチャグループが1つしか見つからない場合、$1と$&Perlの違い

キャプチャグループが1つしか見つからない場合、$1と$&Perlの違い

私が知る限り、$&これが最後に見つかったキャプチャグループです。キャプチャグループが1つしかない場合、同じ2つの変数を返すのはどうですか?たとえば、

$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$1\"/; print;" 
"": value
$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$&\"/; print;"
"key": value

答え1

perl特殊変数はに記録されますperldoc perlvar

ポケットベルがある場合はless(行の先頭で)検索​​して関連セクションにアクセスできます。$&^\s*\$&$&

または、perldoc -v '$&'変数の特定の部分を抽出するには、次のようにします$&

$&      The string matched by the last successful pattern match (not
        counting any matches hidden within a BLOCK or "eval()" enclosed
        by the current BLOCK).

        See "Performance issues" above for the serious performance
        implications of using this variable (even once) in your code.

        This variable is read-only and dynamically-scoped.

        Mnemonic: like "&" in some editors.

したがって、これには、キャプチャグループでキャプチャされたコンテンツは含まれず、正規表現全体が一致するものも含まれます。

とにかく、あなたの質問$1シェルに拡張最初の位置引数(あなたの場合は設定されていないように見えます)は、シェルで有効な変数名ではない$&ため、単独で残されます。$&

内部的に一重引用符を使用しようとしていますが、これは$シェルで特別な意味を失います。

echo 'key: value' | perl -pe 's/([a-z]+):/"$1":/'
echo 'key: value' | perl -pe 's/[a-z]+(?=:)/"$&"/'

より一般的には、ほぼ常に単一(強いperl)または他の言語ソルバーのコードパラメータ(sed -e、、、、awk...)に関連しています。これらの言語には通常、シェルにも特殊な文字が含まれているだけでなく、そうしないとシェル拡張(最初の位置引数でここで拡張するなど)を行うと、これがコード注入の脆弱性になる可能性があります(ここに含まれる場合何が起こるか考えてみてください)。python -csh -c$1$1/;system "reboot" #

関連情報