1

各行に異なる値を持つ同じタイプのデータを印刷しようとしています。その後、各タイプの値を対応する名前(MMaaa / gg / dd)と組み合わせます。
データ例を以下に示します。グループ1を例にとると、名前はMMxxxx / xxx / xxxx(MMaaa / gg / dd)の形式で、タイプ値はID03です。グループは、フルーツ(eg:apple)、フルーツ名(eg:MMbb / gggg / iii)、タイプ値(eg:ID02、ID04、ID05)、または2つのタイプのフルーツと名前(eg:appleとorange)で構成されます。

アップルの名前とそのタイプの値の唯一の組み合わせが私が欲しいものです。期待どおりの結果を得るために組み合わせを印刷しようとしましたが、失敗しました。これまで私はこれを試しました:

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ループは 1 回だけ実行されwhileます (ファイルが空で、実行回数が 0 回でない限り)。一度に 1 行ずつファイルを調べようとしていますが、2 つの異なるループ構造を組み合わせています。

あなたがしたいことは次のとおりです。

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

これにより、一度に 1 行が に割り当てられ$lineます。

このようにすることもできます:

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

しかし、それは全体を一時配列に読み込み、一度に 1 つの配列要素を反復処理します。

于 2013-03-10T06:05:11.810 に答える