1

次の形式のデータがあります。

##############################
# A_Data
##############################
A_Data += data1
data2
data3
data4

###############################
# B_Data
###############################
B_Data += data5
data6

###############################
# C_Data
###############################
C_Data += data7

次のようにデータを個別に抽出したい:

A_Data (e.g.Array)
data1
data2
data3
data4

B_data と C_Data についても同様に、個別に表示できるようにします。私のスクリプトで、私は得ることができます

A_Data += data1
data2
data3
data4

B_Data += data5
data6

C_Data += data7

複数行モードの場合は知っており、何度もグーグル検索しましたが、取得できません。私はperlで正規表現を使用するのが初めてなので、これを手伝ってください。

私がこれまでに試したこと:

ファイルデータを配列に入れて、正規表現を適用しようとしました

@array1;
for (my $i=0;$i < $length;$i++)
{
    $data[$i]=~ s/#.*//;
    #$data[$i]=~ /[A_Data](.*?)[B_Data]/;  ## trying to get data in between those two data.
    print $data[$i]."\n";
}
4

1 に答える 1

2

解決策はデータファイルの正確な形式によって異なりますが、これはあなたが与えた例ではうまくいきます

use strict;
use warnings;

open my $fh, '<', 'data_file.txt' or die $!;

my $tag;
my $data;

while (<$fh>) {
  chomp;
  s/#.*//;
  next unless /\S/;
  $tag = $1 if s/^(\w+)\s*\+=\s*//;
  push @{ $data->{$tag} }, $_ if $tag;
}

use Data::Dump;
dd $data;

出力

{
  A_Data => ["data1", "data2", "data3", "data4"],
  B_Data => ["data5", "data6"],
  C_Data => ["data7"],
}
于 2012-08-16T18:53:46.913 に答える