2011-07-27 7 views
0

複数の行のテキストをソートして抽出する際に問題があります。ここで複数行を抽出するにはどうすればよいですか?

my $searched = $doc->content; 
    if($searched =~ /MODIFIED files in Task $_[1] : (.*?) The/gs){ 
     print $1,"\n"; 
     $Modified = $1; 

    } 
    if($searched =~ m/COMPILED in Task $_[1] : (.*?) The/ms){ 
     $Compiled = $1; 

    } 
    if($searched =~ m/DELETED in Task $_[1] : (.*?) Comments/ms){ 
     $Deleted = $1; 

    } 

ここだが、テキストファイルの例である:ここに私のコードです

The following are the MODIFIED files in Task 50104 : 

**Directory    Filename    Version 
---------    --------    ------- 
Something    Something    ..... 
......     ......     ..... 
.......     ........     .....** 

The following are the files to be COMPILED in Task 50104 : 

**Directory    Filename 
---------    -------- 
.........    .........** 


The following are the files to be DELETED in Task 50104 : 

**Directory    Filename 
---------    --------** 

Comments: 
Blah blah....... 

どこの間でテキスト**私が抽出したいものです。貧しいフォーマット

+0

空の行が「以下は?」が保証されていますか? – Zaid

答えて

1

については申し訳ありません私はあなたのテキストが:周りおよび/コメントの前にスペースが含まれていることを確認していない(実際には、それは:は改行が続いているように私には思える、とTheは改行が先行している、いないスペース) ;

if($searched =~ /MODIFIED files in Task $_[1] : (.*?) The/gs){ 

使用してみてください:

if($searched =~ /MODIFIED files in Task $_[1] :(.*?)The/gs){ 

これが機能しない場合、私はまた...あなたは/ Gまたは/ Mスイッチが必要

を考えていない、私が代わりに使用してのあなたの正規表現を段階的に洗練させることをお勧めします。つまり、最初に/MODIFIED files in Task $_[1] ::まで一致することを確認してから残りを追加してください。

+0

OMG、天才!、それはおかげで – Shahab

0

ここには簡単なハック(テストされていない)があります。救助へ

$ script.pl inputfile.txt

my %data; 
my $header; 
while (<>) { 
    next if /^\s*$/; # skip empty lines 
    if (/^The following are /) { # header line 
     if (/(MODIFIED|COMPILED|DELETED)/) { 
      $header = $1; 
     } else { die "Bad header: $_" } 
    } else { # data line 
     die "Header expected" unless (defined $header); 
     $data{$header} .= $_; 
    } 
} 
+0

エイリー同様のアプローチ、ええ働いた? – Zaid

+0

偉大な心は似ていると思います。 – TLP

1

Flip-flop operator:代わりに文字列にファイル全体を読んで、ライン・バイ・ラインモードでそれを使用!

フリップフロップ演算子は、左右の2つの辺を持ちます。左側がtrueに評価されると、右側がtrueに評価されるまでフリップフロップは真のままです。

use strict; 
use warnings; 

my $searched = $doc->content; 

my %info; #< Store in a hash > 

open my $string, '<', \$searched or die $!; 

{ 
    my ($type, $content); 

    while (<$string>) { # Process $searched line-by-line 

     if (/(MODIFIED|COMPILED|DELETED)/) { 

      $type = $1; 
     } 

     $content .= $_, next if /^Directory/ .. /^\s*$/ ; 

     $content =~ s{\s+$}{}; # Don't need that trailing whitespace 

     if (defined $type && defined $content) { 

      $info{$type} = $content; # Or push @{ $info{$type} }, $content; 
      undef $type; 
      undef $content; 
     } 
    } 
} 
+0

少し古いですが、私はフリップフロップ( '..')演算子を知る方法として、この記事のファンです:http://www.perl.com/pub/2004/06/18 /variables.html – Telemachus

+0

'@ content'に文字列を'プッシュ 'してから、リストやジョインとして処理するのは '。='よりも安いです – mrk

関連する問題