2014-02-19 32 views
1

在Perl就可以編寫使用普通引號或這裏-doc的語句多字符串常量,但由於代碼縮進都算作字符串本身的內容,這一點無論廢墟格式化周圍的代碼,無論是需要我們在使用之前另外使用unindent字符串。在這一點上我用下面的子例程來取消縮進字符串文字:,取消縮進多行字符串字面量

sub unindent { 
    local $_ = shift; 
    $_ =~ s/^\s*$//mg; 
    $_ =~ s/^(\s*>>>\s)//mg; 
    return $_; 
} 

print unindent " 
    >>> #pragma once 
    >>> #include <...> 
    >>> "; 

但不重新發明輪子,我想問一下是否已經有一些用於此目的的內置到Perl或上CPAN?

+4

這是不使用全局默認變量'$ _'子程序內部時,它很容易只需要創建一個詞法變量,例如一個好主意'我的$ str = shift'。 – TLP

+2

或'local $ _ = shift'。 – tobyink

+0

@TLP,@tobyink,ops,我忘了'$ _'不會自動變成本地的。感謝您的更正! – firegurafiku

回答

2

經過一些google搜索,我發現某些包具有相似特性和部分解決問題:

第一個選項需要安裝大量依賴項(對於簡單的unindent函數),其餘三個僅適用於here-docs。這些軟件包似乎都不支持額外的標記(問題中的>>>),我認爲這比標記縮進更安全(由於製表符空間混合問題)。

+0

我真的很喜歡[Heredoc :: Unindent](http://jeremyholland.info/show_file.php?file=Unindent。pm),但它只適用於標識符後面帶有分號的heredocs(例如'<< END;') - 用'[,; \)]#分號(語句結束)替換第56和70行來調整它)或逗號(散列值結束)或括號(substr(<< END,0,-1)構造刪除最後一個換行符)。 – Ansa211

+0

FWIW:源代碼過濾器在生產代碼中被強烈阻止。 – tjd

1

這大概不到一個評論的答案,但由於意見不契約我想通使用的回答將是更好的方式來了解我的點。 我想你尋找一種方式來寫類似

my $str= "Stuff One 
      Stuff Two 
      Stuff Three"; 

,因爲它更具有可讀性,但實際的字符串應該變成:

my $str= "Stuff OneStuff TwoStuff Three"; 

my $str= 
"Stuff One 
Stuff Two 
Stuff Three"; 

吧?我不知道一個模塊來清理字符串,我相信這可能不是微不足道的,因爲使用了製表符或空格,最後一部分後面是否應該有換行符或換行符?你可以不過只寫:

my $str= "Stuff One". 
     "Stuff Two". 
     "Stuff Three"; 

my $str= "Stuff One\n". 
     "Stuff Two\n". 
     "Stuff Three"; 

和保留的完全控制什麼是,什麼也不是沒有用的代碼契約或任何不必要的依存關係搞亂你的字符串的一部分。

+0

很明顯,'.'運算符也可以用來形成多列串,但不得不引用每一行會產生大量的視覺噪聲。我這個問題主要是你提到的第二種情況,保留了新行,但有時候有一個'unindent()'函數的變體也可以用來刪除換行符。 – firegurafiku

+0

好吧,但你必須記住哪一個做什麼。更重要的是,當有人讀你的代碼時,他們會立即知道字符串的外觀以及內容和內容。如果您省略了引號和分數,那麼任何不熟悉字符串使用方式的人都會很困惑。對我來說,一個看起來像是被嚴格定義的字符串,以及我在哪裏必須檢查它的使用方式會比我更多地引用幾個引號和分數。更不用說'unindent()'添加更多的單個字符,而不是最多四行。 – DeVadder

+0

最後,這是如何增加比>>>>更多的視覺噪聲?幾乎每一位程序員,他們是否曾經見過Perl,都會理解這些引言和觀點的作用。但是除了你之外的每個人都會被那些'>>>>'做的事搞糊塗。 – DeVadder