2012-07-12 65 views
1

可能重複:
How do I break out of a loop in Perl?的Perl - 停止讀取一個文件,如果多行匹配

我有數據,看起來就像你所看到的波紋管。我正在嘗試創建一個將捕獲選定文本的perl腳本。我的想法是說「如果上一行讀取全是 - 並且當前行讀取全部=',那麼請停止閱讀文件,並且不要僅用=和 - 打印這些行

但是,我不知道如何編寫代碼,我只是在3天前開始使用perl,我不知道這是否是最好的方式,讓我知道是否有更好的方法如果 無論哪種方式,你可以用代碼的幫助,我會很感激的

到目前爲止我的代碼:

... 
$end_section_flag = "true" # I was going to use this to signify 
          # when I want to stop reading 
          # ie. when I reached the end of the 
          # data I want to capture 

while (<$in-fh>) 
{ 
    my $line = $_; 
    chomp $line; 

    if ($line eq $string) 
    { 
     print "Found it\n"; 
     $end_section_flag = "false"; 
    } 

    if ($end_section_flag eq "false") 
    { 
     print $out-fh "$line\n"; 
     // if you found the end of the section i'm reading 
     // don't pring the -'s and ='s and exit 
    } 
} 

什麼我的數據看起來像

------------------------------------------------------------------------------- 
=============================================================================== 
BLAH BLAH 
=============================================================================== 
asdfsad 
fasd 
fas 
df 
asdf 
a 
\n 
\n 
------------------------------------------------------------------------------- 
=============================================================================== 
BLAH BLAH 
=============================================================================== 
... 

我想捕捉,因爲你的邊界跨越行尾

------------------------------------------------------------------------------- 
=============================================================================== 
BLAH BLAH 
=============================================================================== 
asdfsad 
fasd 
fas 
df 
asdf 
a 
\n 
\n 
+0

您沒有以粗體顯示任何文本。 – Borodin 2012-07-12 14:58:05

+0

[我如何擺脫Perl中的循環?](http://stackoverflow.com/questions/303216/how-do-i-break-out-of-a-loop-in-perl) – 2012-07-12 14:58:31

+0

真實世界例子應該有所幫助從你的問題不清楚你想要達到什麼。顯示:1)你有什麼2)和你想得到什麼3)變成什麼變量。你的代碼沒有關於內容的任何條件 - 「$ end_section_flag」還沒有任何說明。 – jm666 2012-07-12 14:58:45

回答

1

線路明智的處理是不是所以適合什麼。整個文件夾,然後用匹配運算符提取中間文件。

use strictures; 
use File::Slurp qw(read_file); 
my $content = read_file 'so11454427.txt', { binmode => ':raw' }; 
my $boundary = qr'-{79} \R ={79}'msx; 
my (@extract) = $content =~ /$boundary (.*?) $boundary/gmsx; 
+0

我是Perl新手,請介意解釋代碼嗎? 謝謝:) – Ryan 2012-07-12 15:17:53

+0

我將文件內容讀入字符串變量。然後我定義邊界,79破折號和一些換行符和79等於。然後我匹配內容字符串的邊界和中間的邊界。我捕獲中間並將其分配給一個變量。 – daxim 2012-07-12 16:19:25

0

看看這個適合你的需要:

perl -ne 'm/^---/...m?/---/ and print' file 

,你應該只想要第一個塊,改變分隔符從/?正是如此:

perl -ne 'm?^---?...m?^---? and print' file 

range運營商討論。

這將打印由'---'限定的行範圍。您可以使用shell的重定向將輸出重定向到您選擇的文件中:

perl -ne 'm/^---/...m?/---/ and print' file > myoutput 
+0

我不明白這段代碼。它在哪裏?它如何適應?它在做什麼?對不起,我還是Perl的新手。我很感激澄清。 – Ryan 2012-07-12 15:29:29

相關問題