【发布时间】:2017-01-16 18:45:06
【问题描述】:
我有很多制表符分隔的文本文件,我需要在其中捕获测试中相同单词之间的所有内容,输入看起来像这样
H string
H string
H string
SCAN 00001 00001
I string
I string
432.203 194090 0
SCAN 00002 00002
使用相同的模式(以 I 开头的几行,然后是我需要捕获的数字),扫描从最低到最高排序,并且它们是唯一的。在两次“SCAN”之间,只有数字分隔在 3 列空间中,我需要提取第一个和第二个数字,在两次扫描之间,大约有两三千行由 3 个数字组成。
我不是正则表达式之神,但我正在尝试这个
while (<$fh_2>)
{
chomp;
next if (/^H/);
my $sc;
if (/(^S.+[\d]+)/../^S.+[\d]+/ms) #while we are between two ^S
{
my @sc_line= split /\s/, $1; #capture the scan number
$sc= pop @sc_line;
if (/(^[\d]+\.?[\d]*)/) # if there are numbers (m) at the start
{
my @lines = split /\s/, $_;
push @ms, $1; #capture the first number
push @int, $lines[1]; #capture the second number (i)
$m{$sc} = [@ms]; #create hash of array
$in{$sc}= [@int];
}
}
主要问题是我希望在特定扫描之后以某种方式将所有内容与该扫描匹配,但由于模式相同,我发现编写它很棘手。
输出必须是数组的散列或多维散列,其中对于每次扫描,我可以关联每个第一个数字 (m) 和 (i) 数字,它可以是两个单独的散列,也可以不是,只要我可以从扫描号中检索数组。
编辑:我用另一种方式解决了它
while (<$fh_2>)
{
chomp;
next if (/^H/);
if (/^S/)
{
my @sc_line= split /\s/, $_;
my $sc_= pop @sc_line;
push @sc, $sc_;
push @count, scalar @int;
}
elsif (/(^[\d]+\.?[\d]*)/)
{
my @lines = split /\s/, $_;
push @ms, $1;
push @int, $lines[1];
}
}
close $fh_2;
每次@sc 获得一个新元素时,我都使用索引来获取@int(或@ms)的元素数量,一开始不考虑它是愚蠢的。 仍然有兴趣看看是否有任何 TIMTOWTDI 魔法正在发生。
【问题讨论】:
-
你的问题不是很清楚。你能试着澄清一下吗?例如,您想从您提供的示例数据中具体提取什么?您只对
SCAN行感兴趣吗?如果是这样,您是否只对编号不同的SCAN行感兴趣? -
即使是半神也能提供现实世界的输入字符串。
-
更好地提供样本输出
-
@GillesQuenot 添加
-
@redneb 我编辑了问题告诉我现在是否更清楚了