2013-03-09 2 views
1

Я пытаюсь напечатать данные того же типа с разными значениями в каждой строке. После этого объедините каждое значение типа с соответствующим именем (MMaaa/gg/dd).
Пример данных показан ниже. Возьмите группу 1 в качестве примера, имя указано в формате MMxxxx/xxx/xxxx (MMaaa/gg/dd), а значение типа - ID03. Группа состоит из фруктов (например, яблоко), названия фруктов (например, MMbb/gggg/iii) и значений типа (например: ID02, ID04, ID05) или двух типов плодов и имен (например, яблоко и апельсин).Perl: как совместить одно и то же слово в каждой строке до другого слова в новой строке

Единственное сочетание имени яблока и его значений типа - это то, что я хочу. Я попытался напечатать комбинацию, чтобы получить ожидаемый результат, но потерпеть неудачу. До сих пор я попытался это:

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  

ответ

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, если есть в линии а /. Если в строке есть type, она печатает «путь» и type вместе при условии, что $first имеет значение.

+0

Это работает! Благодарю. Что делать, если начало значения типа не ID? Это могут быть любые символы. Например, swe_03_K и Re_M_9. – Zoe

+0

@ Zoe - Является ли надпись «_________________group 5» фактически частью ваших данных? – Kenosis

+0

Это не часть данных. – Zoe

0

Это не касается вашей проблемы с соответствием, но вам нужно знать некоторые другие вещи.

Это неправильно.

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

Что, что делает это прочитать все содержимое файла в @array, а затем переходит в петлю while. Цикл while выполняется ровно один раз (если файл не пуст и он выполняет нулевое время). Вы пытаетесь пройти через файл по одной строке за раз, но вы комбинируете две разные конструкции цикла.

То, что вы хотите сделать, это:

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

Назначает одну строку за один раз $line.

Вы также мог бы сделать это следующим образом:

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

Но что бы прочитать все во временный массив, а затем вы итерация над ним один элементом массива в то время.

Смежные вопросы