2011-11-06 94 views
1

在perl中,如何讀取兩個標記之間的內容。像這樣的源數據perl腳本讀取標記之間的內容

START_HEAD 
ddd 
END_HEAD 

START_DATA 
eee|234|ebf 
qqq|    |ff 
END_DATA 

--Generate at 2011:23:34 

那麼我只想在「START_DATA」和「END_DATA」之間獲取數據。這個怎麼做 ?

sub readFile(){ 
    open(FILE, "<datasource.txt") or die "file is not found"; 

    while(<FILE>){  
     if(/START_DATA/){   
      record(\*FILE);#start record; 
     } 
    } 
} 

sub record($){ 
    my $fileHandle = $_[0]; 

    while(<fileHandle>){ 
     print $_."\n";  
     if(/END_DATA/) return ;   
    } 
} 

我寫這段代碼,它不起作用。你知道爲什麼嗎 ?

感謝

感謝

+2

爲了將來的參考,「不起作用」是不是很豐富。您應該包含錯誤消息或其他有關不工作的信息。 – TLP

+0

'while while {print if/START_DATA/../ END_DATA /}' –

回答

3

除了一些拼寫錯誤,您的代碼不是太遠。您是否使用過

use strict; 
use warnings; 

您可能自己弄明白了。這裏是我發現的:

  • 如果你不需要它們,或者不知道它們做了什麼,不要使用原型。

正常子聲明sub my_function (prototype) {,但你可以離開了原型,只是使用sub my_function {

  • while (<fileHandle>) {缺少$標誌,以表示它是 一個變量(標量),而不是一個全球性的。應該是$fileHandle
  • print $_."\n";將添加一個額外的換行符。只需print;將會做 你期望的。
  • if(/END_DATA/) return;是一個語法錯誤。在這種情況下,perl中的括號不是可選的 。除非你改變陳述。

二者必選其一:

return if (/END_DATA/); 

if (/END_DATA/) { return } 

下面是清理版本。我在測試時註釋了您的open(),所以這將是一個功能性代碼示例。

use strict; 
use warnings; 

readFile(); 

sub readFile { 
    #open(FILE, "<datasource.txt") or die "file is not found"; 
    while(<DATA>) {  
     if(/START_DATA/) { 
      recordx(\*DATA); #start record; 
     } 
    } 
} 

sub recordx { 
    my $fileHandle = $_[0]; 
    while(<$fileHandle>) { 
     print; 
     if (/END_DATA/) { return }   
    } 
} 

__DATA__ 
START_HEAD 
ddd 
END_HEAD 

START_DATA 
eee|234|ebf 
qqq|    |ff 
END_DATA 

--Generate at 2011:23:34 
+0

它仍然會打印「END_DATA」,該如何擺脫?謝謝 – user595234

+0

@ user595234你可以在打印前放置'return'語句。 – TLP

+0

是的,它的工作原理。非常感謝。 Perl很有趣。 – user595234

0

這是一個非常簡單的事情用正則表達式,只需使用/ s或/ M(單線或多線)標誌 - /秒允許.運營商匹配換行符,所以你可以做/start_data(.+)end_data/is

+0

數據是在一個文件裏面,怎麼做? – user595234

6

您可以使用範圍運算符:

perl -ne 'print if /START_DATA/ .. /END_DATA/' 

輸出將包括* _DATA線,太多,但它不應該是如此難以擺脫他們。

+0

除了在標量上下文中(像這樣),它不是範圍運算符,它是觸發器運算符。 –