傾斜牙籤綜合症

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

基本介紹

  • 中文名:傾斜牙籤綜合症
  • 外文名:leaning toothpick syndrome
  • 簡寫:LTS
  • 領域:計算機
簡介,自產生程式,模式的例子,被引用文本的例子,其它語言,C#,C++,Python,Scala,Sed,

簡介

Perl語言的官方文檔引入了這一術語,用於描述Unix風格的正則表達式中大量的前向斜線
LTS出現在許多程式設計語言與許多環境中,包括用於匹配統一資源定位符(URI)的模式(Pattern (software)),以及輸出被引用文本的程式中,許多自產生程式屬於後一類。

自產生程式

自產生程式(Quine),它以哲學家奎恩命名,指的是輸出結果為程式自身源碼的程式。
能夠直接讀取自己源碼、讀入用戶輸入或空白的程式一般都不視為自產生程式。
這種編程思想在計算機剛剛興起的時候就已經出現了。Paul Bratley發表的文章"Computer Recreations: Self-Reproducing Automata"也對此進行了討論。而已知最早的這類程式在1960年代於愛丁堡大學出現,由Hamish Dewar以Atlas Autocode編寫。

模式的例子

下述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,

相關詞條

熱門詞條

聯絡我們