Perl:如何在每一行中匹配相同的单词,直到新行中的不同单词

时间:2013-03-09 01:28:28

标签: perl

我尝试在每行中打印具有不同值的相同类型数据。之后,将每个类型值与相应的名称(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     

2 个答案:

答案 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
}

但是这会将整个读入一个临时数组,然后你一次迭代一个数组元素。