0

私はファイルを持っています:

XXGuy:Tom1XXBill1XX<tab>XXBlah2XX\n
XXFriend:Bob1XXcarry:Stuff1XX\n
XXGuy:Tom2XXBill2XX<tab>XXBlah7XX\n
XXFriend:Bob2XXcarry:Stuff2XX\n

抽出したいコンテンツは、Tom{1,2}、Bob1{1,2}、および Stuff1{1,2} であり、出力します。

「Tomx の友達は Bobx で、Stuffx を運んでいます」

複数のキャプチャ グループで複数行の正規表現を使用できます。Tomx、Bobx、および Stuffx は $1、$2、および $3 になり、各要素を出力できますが、希望する方法でそれらを実際に処理することはできません。説明-どの構造に格納するか(配列/ハッシュはここで請求書に適合しないと思われますか?)、データを取得する方法がわかりません。

私はこれらの投稿を見ています:

Perl: 配列から値のペアを プルする 複数行の正規表現で複数の一致を見つける perl

提案?

4

2 に答える 2

2

通常、リスト コンテキストでフラグを探しますが/g、結果をどうするかは難しい部分です。私はこのようなことをしますが、それが絶対的な最善の方法かどうかはわかりませんが、役立つはずです:

#!/usr/bin/env perl

use strict;
use warnings;

my $string = <<'END';
XXGuy:Tom1XXBill1XX XXBlah2XX
XXFriend:Bob1XXcarry:Stuff1XX
XXGuy:Tom2XXBill2XX XXBlah7XX
XXFriend:Bob2XXcarry:Stuff2XX
END

my @data;
push @data, [$1,$2,$3] while $string =~ /(Tom\d+).*?(Bob\d+).*?(Stuff\d+)/msg;

use Data::Dumper;
print Dumper \@data;

perldoc perlretutperldoc perlrerefでもっと読む

于 2012-11-21T04:46:16.870 に答える
0

データに名前付きキャプチャを使用するオプションは次のとおりです。

use strict;
use warnings;

while (<DATA>) {
    if (/:(?<name>.+?)XX.+(?=\t)/) {
        print "$+{name}'s friend is ";
        next;
    }

    /:(?<name>.+?)XX.+:(?<stuff>.+?)XX/;
    print "$+{name} and is carrying $+{stuff}\n";
}

__DATA__
XXGuy:Tom1XXBill1XX XXBlah2XX
XXFriend:Bob1XXcarry:Stuff1XX
XXGuy:Tom2XXBill2XX XXBlah7XX
XXFriend:Bob2XXcarry:Stuff2XX

出力:

Tom1's friend is Bob1 and is carrying Stuff1
Tom2's friend is Bob2 and is carrying Stuff2
于 2012-11-22T07:36:30.287 に答える