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中阅读更多信息(或天堂帮助你perldoc perlre

于 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 回答