1

我正在尝试在每行中打印具有不同值的相同类型数据。之后将每个类型值与相应的名称(MMaaa/gg/dd)结合起来。
数据示例如下所示。以组 1 为例,名称格式为 MMxxxx/xxx/xxxx (MMaaa/gg/dd),类型值为 ID03。一组由水果(例如:apple)、水果名称(例如:MMbb/gggg/iii)和类型值(例如:ID02、ID04、ID05)或两种类型的水果和名称(例如:苹果和橙子)组成。

我想要的是苹果名称及其类型值的唯一组合。我试图打印组合以获得预期的结果但失败了。到目前为止,我已经尝试过:

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";
    }
}    

数据:

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     
4

2 回答 2

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如果行中有 a ,则脚本将“路径”字符串存储到其中/。如果其中有一行type,它会打印“路径”并type一起提供$first一个值。

于 2013-03-09T02:00:18.917 回答
0

这并不能解决您的匹配问题,但您需要了解其他一些事情。

这是错误的。

while (@array = <FILE>) {
    foreach $line (@array) {
        ...
    }
}

所做的是将文件的全部内容读入@array,然后进入while循环。while循环只执行一次(除非文件为空并且执行零次)。您试图一次遍历文件一行,但您正在组合两个不同的循环结构。

你想做的是:

while ($line = <FILE>) {
    ... loop contents ...
}

这一次将一行分配给$line

你也可以这样做:

for $line (<FILE>) {
    .... loop contents
}

但这会将整个内容读入一个临时数组,然后您一次遍历一个数组元素。

于 2013-03-10T06:05:11.810 回答