Regex Perl:如何使用适当的数据结构:多行、多捕获组

Regex Perl:如何使用适当的数据结构:多行、多捕获组,regex,perl,Regex,Perl,我有一个文件: XXGuy:Tom1XXBill1XX<tab>XXBlah2XX\n XXFriend:Bob1XXcarry:Stuff1XX\n XXGuy:Tom2XXBill2XX<tab>XXBlah7XX\n XXFriend:Bob2XXcarry:Stuff2XX\n XXGuy:tom1xbill1xxxblah2xx\n XXFriend:Bob1XXcarry:Stuff1XX\n XXGuy:Tom2XXBill2XXXXBlah7XX\n X

我有一个文件:

XXGuy:Tom1XXBill1XX<tab>XXBlah2XX\n
XXFriend:Bob1XXcarry:Stuff1XX\n
XXGuy:Tom2XXBill2XX<tab>XXBlah7XX\n
XXFriend:Bob2XXcarry:Stuff2XX\n
XXGuy:tom1xbill1xxxblah2xx\n
XXFriend:Bob1XXcarry:Stuff1XX\n
XXGuy:Tom2XXBill2XXXXBlah7XX\n
XXFriend:Bob2XXcarry:Stuff2XX\n
我要提取的内容是Tom{1,2}、Bob1{1,2}和Stuff1{1,2}并打印:

“Tomx的朋友是Bobx,带着Stuffx”

我可以使用带有多个捕获组的多行正则表达式,Tomx、Bobx和Stuffx的价格分别为1美元、2美元和3美元,我可以打印出每个元素,但不能按照我所描述的方式处理它们-我不知道如何存储到什么结构(数组/哈希不适合这里的账单?)中并检索数据

我正在看这些帖子:


建议?

通常,您要在列表上下文中查找
/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;
#/usr/bin/env perl
严格使用;
使用警告;

my$string=这里有一个在数据上使用命名捕获的选项:

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