2016-12-12 110 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不應該檢測反斜槓是否用作轉義字符?例如,當反斜槓不在分隔符前面時,它應該被視爲文字;如果是這樣的話,我就不會需要3個反斜槓表示兩個,例如,

q<a\\b> 

q<a\\\b>. 
+2

嘗試使用'q/\ /',你會看到需要避免反斜槓。 – cHao

+0

對不起,我原來的問題並不完全清楚。我添加了「literal」這個詞來強調反斜槓不起轉義字符作用時的事實。你的例子並沒有像你的情況那樣反映我的觀點,根據定義,分隔符前面的反斜槓用作轉義字符。 – Ltf4an

+1

「當反斜槓不在分隔符前面時,應該將其視爲文字」那麼如何創建以反斜槓結尾的字符串? 'q/\ /' - >文字斜槓,無結束分隔符(語法錯誤); 'q/\\ /' - >文字反斜槓,文字斜槓,無關閉分隔符(語法錯誤); 'q/\\\ /' - >文字反斜槓,文字反斜槓,文字斜線,無關閉分隔符(語法錯誤); ... – ThisSuitIsBlackNot

回答

11

,而不是有沒有必要逃避單一的反彈引用的字符串?

是的,如果反斜槓後跟一個反斜槓,或者是字符串中的最後一個字符:

$ 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;這似乎並不方便。

實際上,您只需要三個(因爲第二個反斜槓之後沒有另一個反斜槓)。但是,作爲一種替代,如果你的字符串包含了很多反斜槓,你可以使用單引號定界符,這不需要轉義:

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

三個就足夠了。

這似乎並不方便。

它比雙引號字符串更方便,反斜槓必須總是被轉義。單引號的字符串需要儘可能少的轉義,而不會失去生成分隔符的能力。