2011-09-08 62 views
2

我用下面的Perl表達式刪除選項卡從here刪除製表符 - perl的

$text =~ s{(.*?)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge; 

我已經簡化我的理解和翻譯下面的這個(假定四個空格的標籤寬度)

$text =~ s/(.*?)\t/' '/; 

,但我覺得我打破了愛因斯坦的指令

讓事情就這麼簡單possib樂,但並不簡單。

我用下面的輸入字符串測試。

"\t \t" 
"\t\t \t" 
"\t\t \t\t \t" 
"\t\t \t\t  \t" 

有人可以證明輸入字符串,會給這兩個不一致的結果嗎?

+0

由於第二個不更換參考'$ 1'是行不通......除非這只是一個錯字? –

+2

您誤解了標籤頁。選項卡表示可變數量的空格,而不是其數量。 – tchrist

+0

也許你正在尋找像[perltidy](http://search.cpan.org/perldoc?perltidy)之類的東西? – TLP

回答

2

(除去標籤的問題空間內)我即認爲你的第二簡化的表達被認爲是:

$text =~ s/(.*?)\t/$1 /g; 
# four spaces -------^^^^ 

$g_tab_width爲四個;在這裏沒有別的東西對我有意義,所以我會過着危險的生活,並認爲事情應該是有道理的。

鑑於這種情況,幾乎任何標籤會產生不同的結果。例如:

"where\tis pancakes house?" 

可生產這些結果:

"Where is pancakes house?" # Long method. 
"Where is pancakes house?" # Simplified method. 

直播版本:http://ideone.com/LbnNx

他們都會產生相同的結果是,當你的非標籤組件都是4唯一的一次* n個字符長,例如:

"xxxx\tyyyy\tzzzz" 

直播版本:http://ideone.com/Kvp3l

+0

酷非常感謝 – hawkeye

+0

是否有一個原因,爲什麼'$文字=〜S/\ t//克;'(含4位,當然)是行不通的?你是否試圖保留任何製表符,或只是將它們全部替換? –

+0

@Sho:因爲他試圖'$文字= 382 4 {\ T(*?)} {$ 1。(」'×($ g_tab_width - 長($ 1)%$ g_tab_width))}戈;'這樣的空間每個選項卡取決於選項卡的位置。 –