2010-06-01 26 views
4

我想剝離我的源文件。 (請不要說爲什麼我想要剝奪我的消息來源,這不是重點:-)我找不到一個實用程序來做到這一點。 Eclipse沒有爲我做,所以我實現了我自己的。有沒有更好的方法來使用Perl進行detab(擴展標籤)?

我無法將其納入一個班輪(-e)計劃。 我來了以下,這工作做得很好。

while(<>) 
{ 
    while(/\t/) { 
     s/^(([^\t]{4})*)\t/$1 /; 
     s/^((([^\t]{4})*)[^\t]{1})\t/$1 /; 
     s/^((([^\t]{4})*)[^\t]{2})\t/$1 /; 
     s/^((([^\t]{4})*)[^\t]{3})\t/$1 /; 
    } 
    print; 
} 

但是,它讓我懷疑Perl--處理文本的冠軍語言 - 是否是正確的工具。代碼看起來不是很優雅。如果我不得不關閉假設tab = 8個空格的源代碼,那麼代碼看起來會更糟糕。

特別是因爲我能想到一個只有4個狀態的確定性狀態機來完成這項工作。

我有一種感覺,更優雅的解決方案存在。我錯過了一個Perl成語嗎?本着TIMTOWTDI的精神,我很好奇其他的方法。

u。

+0

刪除標籤並不像看起來那麼容易。混合的製表符/空格縮進最終可能會打破。同樣,在標籤中隱藏空格也很容易:「\ t \ t」實際上會顯示爲兩個標籤(即通常爲4,8或16列)。 – tsee 2010-06-02 07:55:20

回答

7

我記得O'Reilly的一本書中的一個detabify腳本,但我現在似乎無法找到鏈接。

我不得不解決這個問題爲好,我定居在此簡潔的解決方案,以detabify一行:

1 while $line =~ s/\t/" " x ($tablength - ($-[0] % $tablength))/e ; 

在該正則表達式$-[0]是的「預匹配的」部分的長度該行 - 製表符之前的字符數。


作爲一個班輪:

perl -pe '1 while s/\t/" "x(4-($-[0]%4))/e' input 
+0

不錯,我不熟悉@ +和@ - 數組。謝謝。但是,你的答案是否定的。正確的答案是: while s/\ t /「」x(4 - ($ - [0]%4))/ e – Uri 2010-06-01 20:39:53

+0

謝謝你,這是一個很好的結果。也許我應該更努力地使用現有的模塊。 – mob 2010-06-01 20:52:07

12

舊的Unix程序「擴展」發生了什麼?我以前一直都在使用它。

+2

+1我不確定這個問題是否是修辭性的,但是在我的Debian/Ubuntu系統中,它位於'coreutils'軟件包中。 – 2010-06-01 21:17:24

+0

我發現「擴展」的作品很棒。下面是一個如何使用它將4個字符的製表符擴展到空格的例子:'expand --tabs = 4 input.cpp> output.cpp' – 2013-04-27 23:53:15

2

我這樣做是VIM:

:%s/^V^I/ /g 

(這是一個文字^V其次是文字標籤) ,然後:%gq修復不正確的間距。 Perl是矯枉過正的。

3

不能讓vi獨自一人在這裏。的emacs:

M-x tabify 
M-x untabify 
1

的確切的表達式爲:

1 while $line =~ s/\t/" " x ($tablength+1 - ($-[0] % $tablength))/e ; 

而擴大爲命令行有用不可膨脹或不一些行的程序的內部。

相關問題