4

の区切り文字としてアポストロフィ (一重引用符) を使用するなどして、補間がオフになっている場合に、Perl 正規表現での一致から除外されるエスケープ シーケンスと、m''その理由について知りたいです。perlopでの補間の説明では、次のことが言及されています。

この段階では補間は実行されません。を含むバックスラッシュ付きのシーケンス\\は、正規表現を解析する段階で処理されます。

しかし、perlreにあるエスケープ シーケンスをテストすると、すべてのエスケープ シーケンスが同じように扱われるわけではないことがわかります。

そこで、 perlreの「エスケープ シーケンス」セクションにリストされているすべての単純なエスケープをテストしたところ、「オフ」のものと「オン」のものがあることがわかりました。perlrebackslashの「on」および「off」エスケープと、「文字エスケープ」および「エスケープ修飾子」の記述の間にそれぞれ対応があるようです。これまでのところ、そのページにリストされている可能性のあるすべてのエスケープをテストしたわけではなく、これら 2 つのグループからのものだけをテストしました。

考えられるすべてのエスケープをテストしたとしても、補間がオフのときに機能するものとそうでないものがある理由を理解できません。誰でも私を啓発できますか?


更新: @tchrist が提案したように、いくつかの例を次に示します。基本的に、次のシェル コードのバリエーションを使用して、STDIN からのユーザー入力に対してこれらをテストしました。

perl -e "use 5.012; while(<>) { say 'YES' if m'\t';}"

エスケープ\e\f\n\r、および\tは、 (etc.) などの補間されていない一致構造で使用された場合m'\t'でも、リテラル文字列表現ではなく、エスケープする特殊文字と一致します。これは、補間形式のマッチング (例: m/\t/) を使用したときに見られるのと同じマッチング動作です。これは、私がまだ「機能している」という意味です。

一方、\L\U\l、 などの修飾子は、 の内部と の内部\uでは同じようには機能しません。たとえば、「これは文字列です」という入力には一致しませんが、そのような入力には一致します。最初の形式、「\uthis is a string.」という入力に一致します。m''m//m'\uthis'm/\uthis/

4

1 に答える 1