0

次のような多くのエントリを含むテキスト ファイルがあります。

[...]
Wind: 83,476,224
Solution: (category,runs)~
0.235,6.52312667,~
0.98962,14.33858333,~
sdasd,cccc,~
0.996052905,sdsd
EnterValues: 656,136,1
Speed: 48,32
State: 2,102,83,476,224
[...]

上記の部分から、抽出したいと思います:

Solution: (category,runs)~
0.235,6.52312667,~
0.98962,14.33858333,~
sdasd,cccc,~
0.996052905,sdsd

EnterValues:every の後に存在する場合は簡単ですがSolution:、残念ながらそうではありません。ある時はそうSpeed、ある時は違う。正規表現の終わりを構築する方法がわかりません(次のように sth する必要があると思います: Solution:.*?(?<!~)\n)。

私のファイルには、改行の区切り文字として \n があります。

4

3 に答える 3

1

ご覧のとおり、最初にすべてのファイルをメモリに読み込みますが、これは良い方法ではありません。フリップフロップ演算子を使用してみてください:

while ( <$fh> ) {
   if ( /Solution:/ ... !/~$/ ) {
      print $_, "\n";
   }
}

今はテストできませんが、これでうまくいくと思います。

于 2013-10-18T16:10:00.383 に答える
1

必要なのは、正規表現の機能を持つ「レコード区切り」を適用することです。残念ながら、$/は正規表現ではないため、使用できません。ただし、ファイル全体を 1 行に読み取り、正規表現を使用してその行を分割できます。

use strict;
use warnings;
use Data::Dumper;

my $str = do { 
    local $/;   # disable input record separator
    <DATA>;     # slurp the file
};
my @lines = split /^(?=\pL+:)/m, $str;  # lines begin with letters + colon
print Dumper \@lines;

__DATA__
Wind: 83,476,224
Solution: (category,runs)~
0.235,6.52312667,~
0.98962,14.33858333,~
sdasd,cccc,~
0.996052905,sdsd
EnterValues: 656,136,1
Speed: 48,32
State: 2,102,83,476,224

出力:

$VAR1 = [
          'Wind: 83,476,224
',
          'Solution: (category,runs)~
0.235,6.52312667,~
0.98962,14.33858333,~
sdasd,cccc,~
0.996052905,sdsd
',
          'EnterValues: 656,136,1
',
          'Speed: 48,32
',
          'State: 2,102,83,476,224
'

これらの変数に対して何らかの後処理を行うことになると思いますが、それはあなたに任せます。ここから進む 1 つの方法は、改行で値を分割することです。

于 2013-10-18T16:10:23.330 に答える
0

from Solutionto 単語の後にコロン、

my ($solution) = $text =~ /(Solution:.*?) \w+: /xs;
于 2013-10-18T16:56:09.387 に答える