傾斜牙籤綜合徵
傾斜牙籤綜合徵(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,C,PHP):
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++
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,
參見
參考文獻
- ^ perlop - perldoc.perl.org. [2012-04-12]. (原始內容存檔於2012-07-17).