2012-06-22 50 views

回答

3

您可能正在尋找/<!--\[perl\](.*?)-->/s

使用選項開關/s

它把字符串作爲單行。

「。」 (點)將匹配任何字符,包括換行符。

2

有兩件事情在嘗試讓多個正則表達式在多行中工作時經常會讓人們絆倒。

第一個事實是,除非您在m//s///運算符上使用/s選項,否則正則表達式中的點不匹配換行符。

第二個是,如果您一次處理文本文件一行(可能是while (<$filehandle>) { ... }),則每次循環時只有一行文本需要匹配。您需要立即讀取整個文件(可能使用$text = do { local $/; <$filehandle>};)。

1
#!/usr/bin/env perl 

use strict; use warnings; 

{ 
    local $/ = '-->'; 
    while (my $chunk = <DATA>) { 
     $chunk =~ s/<!-- \[perl\] (.*) --> \z//sx; 
     print $chunk; 
    } 
} 

__DATA__ 
<!--[perl] 

my $x = 5; 
my $y = 3; 
say $x + $y 

--> 

<!--[not] 

const char *s = "This is not Perl ;-)"; 

--> 

通過明智地改變input record separator,可以確保每塊你用字符串"-->"讀取結束。然後,通過向您的替換運算符提供/s標誌,確保.可以匹配行結束符。

輸出:

 

<!--[not] 

const char *s = "This is not Perl ;-)"; 

-->

您也可以拆下通往/來自塊尾隨空格,如果該事項。