我尝试在每行中打印具有不同值的相同类型数据。之后,将每个类型值与相应的名称(MMaaa / gg / dd)组合 数据示例如下所示。以组1为例,名称格式为MMxxxx / xxx / xxxx(MMaaa / gg / dd),类型值为ID03。一组由水果(例如:苹果),水果名称(例如:MMbb / gggg / iii)和类型值(例如:ID02,ID04,ID05)或两种类型的水果和名称(例如:苹果和橙子)组成。 / p>
苹果名称及其类型值的唯一组合就是我想要的。 我试图打印组合以获得预期的结果,但失败了。到目前为止,我已经尝试过这个:
while (@array = <FILE>) {
foreach $line (@array) {
if($line =~ m/apple\s{1}MM/) {
$a = $line;
if($line =~ m/(type)/) {
$b = $line;
}
}
print "\n$a/$b\n";
}
}
DATA:
apple
apple MMaaa/gg/dd
type ID03_________________group 1
apple
apple MMsss/ff/dd
orange MMmm/ss
orange MMll/fff______________group 2
apple
apple MMbb/gggg/iii
type ID02
type ID04
type ID05_________________group 3
apple
apple MMhh/jj/lll
orange MMff/gg_______________group 4
apple
apple MMll/pp/ooo
type ID09
type ID03_________________group 5
..
..
.
.
预期结果:
aaa/gg/dd/ID03
bb/gggg/iii/ID02
bb/gggg/iii/ID04
bb/gggg/iii/ID05
ll/pp/ooo/ID09
ll/pp/ooo/ID03
答案 0 :(得分:2)
也许以下内容会有所帮助:
use strict;
use warnings;
my $first;
while (<DATA>) {
chomp;
$first = ( split ' ' )[1] if m!/!;
print "$first/" . ( split ' ' )[1], "\n" if /^type/ and $first;
}
__DATA__
apple
apple MMaaa/gg/dd/MMhh/jj/lll
type ID03
apple
apple MMsss/ff/dd
orange MMmm/ss
orange MMll/fff
apple
apple MMbb/gggg/iii
type ID02
type ID04
type ID05
apple
apple MMhh/jj/lll
orange MMff/gg
apple
apple MMll/pp/ooo
type ID09
type ID03
输出:
MMaaa/gg/dd/MMhh/jj/lll/ID03
MMbb/gggg/iii/ID02
MMbb/gggg/iii/ID04
MMbb/gggg/iii/ID05
MMll/pp/ooo/ID09
MMll/pp/ooo/ID03
如果行中有$first
,脚本会将'path'字符串存储到/
。如果一行中包含type
,则会打印“路径”和type
,只要$first
具有值。
答案 1 :(得分:0)
这不能解决您的匹配问题,但您需要了解其他一些事项。
这是错误的。
while (@array = <FILE>) {
foreach $line (@array) {
...
}
}
这样做是将文件的全部内容读入@array
,然后进入while
循环。 while
循环只执行一次(除非文件为空并且执行零次)。您试图一次遍历文件一行,但是您正在组合两个不同的循环结构。
您想要做的是:
while ($line = <FILE>) {
... loop contents ...
}
这会一次指定一行$line
。
你也可以这样做:
for $line (<FILE>) {
.... loop contents
}
但是这会将整个读入一个临时数组,然后你一次迭代一个数组元素。