2012-03-20 70 views
-1

我行如何使用Perl的正則表達式來捕獲特定的文本行

__Data__ 
test 
aaaaaaaaaaaaaaaa 
-dkdkdkdkdkd 

__Data__ 
test 

aaaaaaaaaaaaaaaaa

我只是想捕獲的文本行的下面的文本。此代碼不起作用。什麼是正則表達式只捕獲的文本行,並把它變成我的類型變量

$/="__Data__"; 

open READFILE,"<", "one_test.txt" or die "Unable to open file"; 

while(<READFILE>) { 
    if(/^test.*\n^([A-Za-z].*)\n(^.*)?/ms) { 
     print $1,"\n"; 
     # my lineA = $1; not working, I can't use this variable outside the if construct (see below) 
    } 
    # print lineA; # does not work 
} 
+0

什麼是「不工作」是什麼意思?另外,Perl中的內聯註釋以'#'開頭,而不是'//'。 – 2012-03-20 16:30:21

+0

perl中的註釋使用英鎊'#'符號,而不是雙斜槓''''。 – TLP 2012-03-20 16:30:41

+0

如果這個文件不太大,不適合內存,我認爲把這個東西扯到內存中,grep {/ aaaaaaaaaaaaaaaaa /} split(/ __ Data __ /)將是最簡單的方法。 – user1481 2012-03-20 22:59:57

回答

3

的除了你的其他錯誤,使用/s修改將使外卡.匹配換行符。由於您使用的是貪婪的.*,它會將所有內容都匹配到字符串的末尾,而不會留下任何內容。

解決方法是刪除/s修飾符,或者通過使用.*?來代替,使匹配非貪婪。

你其他錯誤:

  • 評論與#沒有//啓動。
  • my lineA - >lineA是裸詞,而不是一個變量。使用$lineA
  • 封閉塊{ my $var }內使用my將限制它的範圍,以該塊。爲了在塊之外使用它,將my聲明放在塊之外。
  • $/是您的記錄結束,因此與具有領先__DATA__自己的輸入,將首先在一個空的記錄中讀取。
  • 始終使用use strict; use warnings;,因爲它會阻止簡單的錯誤,並給你很好的調試信息。它節省了很多時間。
  • 使用正確的縮進,編寫代碼將少得多麻煩。我建議使用適當的編輯器來處理它,比如vim/gvim。
0

好建議來自TLP。在你的代碼中,我不知道你爲什麼將輸入與__Data__分開。我想有更多的信息,我不知道,但一個方法可以通過行讀取文件中的行與正則表達式是如此簡單:

use warnings; 
use strict; 

open my $readfile ,"<", "one_test.txt" or die "Unable to open file"; 

my $lineA; 

while (<$readfile>) { 
    chomp; 
    $lineA = $1 if m/\A(a+)\Z/; 
} 
0

我想有你爲什麼要一個很好的理由從__Data____Data__
TLP已經解釋了爲什麼你需要刪除/ s修正。
因此,不再需要在您的正則表達式中添加'^'。
您還需要在變量前加$(猜測是一個錯字)。
而你需要在if塊外執行我的聲明,否則該變量是該塊的局部變量。

下面是示例代碼,(也許)做什麼你要找的: (假設只有一個「線」中找到)。

use strict; 
use warnings; 

$/="__Data__"; 
open READFILE,"<", "test.txt" or die "Unable to open file"; 
my $lineA; 
while (<READFILE>) { 
     if (/^test.*\n(a+)\n(.*)?/m) { 
      $lineA = $1; 
     } 
} 

print "line with a's: $lineA\n"; 
相關問題