傾斜牙籤綜合症

傾斜牙籤綜合症leaning toothpick syndrome,LTS)是指在電腦程式設計中,由於表達式包含了大量的轉義字符而使代碼變得難以閱讀,通常是指反斜線("\")開頭的轉義字符序列。

Perl語言的官方文檔[1]引入了這一術語,用於描述Unix風格的正則表達式中大量的前向斜線

LTS出現在程式語言與環境中,包括用於匹配統一資源定位符(URI)的模式(Pattern (software)),以及輸出被引用文本的程序中,許多自產生程式屬於後一類。

模式的例子

下述Perl正則表達式用來匹配在某個FTP伺服器的pub目錄下的文檔的URI:

  m/ftp:\/\/[^\/]*\/pub\//

Perl通過允許正則表達式使用其它分界符來解決傾斜牙籤綜合症。例如,下述三個正則表達式均等價於上例:

 m{ftp://[^/]*/pub/}
 m#ftp://[^/]*/pub/#
 m!ftp://[^/]*/pub/!

被引用文本的例子

以下Perl樣例程序用於輸出HTML連結的文本,其中URL與顯示文本分別存於變量$url$text之中,代碼如下:

 print "<a href=\"$url\">$text</a>";

注意上述程序中使用反斜線轉義雙引號。如果使用單引號括起上述字符串表達式,在Perl中是不可行的,因為Perl對單引號字符串不執行變量展開:

 print '<a href="$url">$text</a>'

在許多語言中使用printf函數是可行的辦法(Perl,CPHP):

 printf("<a href="%s">%s</a>", $url, $text);

在Perl中使用qq即可用任意字符代替雙引號:

 print qq{<a href="$url">$text</a>};
 print qq|<a href="$url">$text</a>|;
 print qq(<a href="$url">$text</a>);

Here文檔特別適合於多行文檔;但是,Here文檔不能夠正確的縮進。這樣的Perl示例為:

 print <<HERE_IT_ENDS;
 <a href="$url">$text</a>
 HERE_IT_ENDS

其它語言

C#

C#語言處理LTS的方法是在字符串開始的引號之前加上「@」這個字符,例如:

string filePath = @"C:\Foo\Bar.txt"

而不是這樣:

string filePath = "C:\\Foo\\Bar.txt"

C++

C++11增加了原始字符串:

 std::string filePath = R"(C:\Foo\Bar.txt)";

如果字符串包含了)"這兩個字符的組合,可選別的分界符,如d,例如:

 std::regex re{ R"d(s/"\([^"]*\)"/'\1'/g)d" };

Python

Python也有原始字符串的機制,在字符串前加上「r」即可:

 filePath = r"C:\Foo\Bar.txt"

Scala

Scala語言可用三個引號以避免轉義混淆:

 val filePath = """C:\Foo\Bar.txt"""
 val pubPattern = """ftp://[^/]*/pub/"""r

三引號也可用於多行字符串,例如:

 val text = """First line,
 second line."""

Sed

Sed正則表達式,尤其當使用「s」操作符時,具有和Perl類似的問題——缺省分界符是「/」,但是其它分界符也可以使用——缺省是s/regexp/replacement/,但是s,regexp,replacement,效果是一樣的。例如,為了匹配上述Perl例子之中的"pub"目錄並替換為"foo",使用斜線的缺省形式是:

s/ftp:\/\/[^\/]*\/pub\//foo/

使用(',')分界符的形式為:

s,ftp://[^/]*/pub/,foo,

參見

參考文獻

  1. ^ perlop - perldoc.perl.org. [2012-04-12]. (原始內容存檔於2012-07-17).