2016-12-12 17 views
2

次の例のプリント "SAME":なぜq/\ a/equal q/ a /ですか?

if (q/\\a/ eq q/\a/) { 
    print "SAME\n"; 
} 
else { 
    print "DIFFERENT\n"; 
} 

私はこれがdocumentationと一致している理解しています。しかし、私はこの行動が望ましくないと思います。 lilteralを一重引用符で囲んだ文字列にしてエスケープする必要がありますか? 2つのバックラッシュが必要な場合は、4を指定する必要があります。これは便利ではないようです。

バックスラッシュがエスケープ文字として機能するかどうかをPerlで検出しないでください。たとえば、バックスラッシュが区切り文字の前にない場合は、リテラルとして扱う必要があります。それが事実であればと、私は2つ、例えばを表現するために3つのバックスラッシュを必要としない、代わりに

q<a\\\b>. 
+2

'q/\ /'を使ってみると、バックスラッシュをエスケープする必要があります。 – cHao

+0

申し訳ありませんが、私は私の元の質問で完全に明確ではありませんでした。バックスラッシュがエスケープ文字として機能しないという事実を強調するために、 "literal"という単語を追加しました。あなたの例は私の問題点をあなたの場合と同じように反映していません。定義によると、区切り文字の前のバックスラッシュはエスケープ文字として機能します。 – Ltf4an

+1

"バックスラッシュが区切り文字の前にない場合は、リテラルとして扱う必要があります。"次に、バックスラッシュで終わる文字列をどのように作成しますか? 'q/\ /' - >リテラルスラッシュ、終了区切り文字なし(構文エラー)。 'q/\\ /' - >リテラルバックスラッシュ、リテラルスラッシュ、終了デリミタなし(構文エラー)。 'q/\\\ /' - >リテラルバックスラッシュ、リテラルバックスラッシュ、リテラルスラッシュ、終了デリミタなし(構文エラー)。 ... – ThisSuitIsBlackNot

答えて

11

q<a\\b> 

は単一でバックラッシュをエスケープする必要があります引用符で囲まれた文字列?

バックスラッシュが他のバックスラッシュに続く、または最後の文字が文字列になっている場合は、[はい、:

$ perl -e'print q/C:\/' 
Can't find string terminator "/" anywhere before EOF at -e line 1. 
$ perl -e'print q/C:\\/' 
C:\ 

これを含む単一引用符で囲まれた文字列内の任意の文字を含めることが可能となりますデリミタとエスケープ文字を使用します。


私は2つのガタを望んでいた場合、私は4を指定する必要があるだろう。これは便利ではないようです。

実際は、2つ目のバックスラッシュには別のバックスラッシュがないため、3つだけ必要です。あなたが削除することができヒアドキュメントが最後に改行を追加すること

my $path = <<'END'; 
C:\a\very\long\path 
END 

chomp $path; 
print $path; # C:\a\very\long\path 

注:しかし、代替として、あなたの文字列はバックスラッシュの多くが含まれている場合にはエスケープを必要としない単一引用符で囲まれたヒアドキュメントを、使用することができますchomp。デリミタまたはバックスラッシュが補間された場合にはデリミタまたは他のバックスラッシュ、続いない限り

単一引用符で囲まれた文字列リテラルで
+1

* "エスケープする必要のない一重引用符付きのheredocを使うことができます" *ありがとうございました。私はいつも一重引用符付きのターミネーター付きの* heredoc *は一重引用符付きの文字列とまったく同じように動作すると信じていましたが、エスケープする "区切り文字"がないので複数のバックスラッシュのみをエスケープする必要があります。私は間違っていることを非常に嬉しく思います。 – Borodin

+0

私はPerlがリテラルバックスラッシュとエスケープバックスラッシュを区別する必要がある場合に、私の質問を編集しました。 – Ltf4an

10

バックスラッシュは、バックスラッシュを表します。言い換えれば

  • あなたは区切り文字をエスケープする必要があります。
  • \の後に\または区切り文字が続くエスケープする必要があります。
  • \には、\または区切り文字が続かないことがあります。

ので、

q/\//  ⇒ /
q/\\\\a/ ⇒ \\a 
q/\\\a/ ⇒ \\a 
q/\\a/  ⇒ \a 
q/\a/  ⇒ \a 

は、単一引用符で囲まれた文字列でのバックラッシュをエスケープする必要がありますか?

はい、別のバックスラッシュまたは区切り文字が続く場合は、そうです。

私は2つのガタを望んでいた場合、私は4

スリーが十分で指定する必要があると思います。

これは便利ではないようです。

バックスラッシュを常にエスケープしなければならない二重引用符で囲まれた文字列より便利です。一重引用符で囲まれた文字列は、区切り文字を生成する能力を失うことなく、エスケープ可能な最小量を必要とします。

関連する問題