2013-12-09 7 views
1

У меня есть некоторые данные, как например:Perl Regular Expression Pattern

TYPE: Travel 
ADDRESS 
    Barcelona 
    Paris 

Таким образом, адрес может быть 1 или много (мне нужно сбросить адрес и получить только те города). По какой-то причине мой синтаксический анализ завершился неудачей (напечатан только «АДРЕС») для получения правильного результата. Я что-то пропустил?

elsif (/^ADDRESS/) { 
    my @address_t = split /[no matter what i put,only ADDRESS is printed]+/, $_; 
     shift @address_t; #is this how i will discard ADDRESS ? 

     foreach my $address (@address_t) { 
       @address_names = ($address);    
    } 

Я думаю, что регулярное выражение должно быть разделено на новую строку, пробел?

Это, как я обработан ТИП:

elsif (/^TYPE/) { 
      my @type_t = split '\s', $_; 
      $type = $type_tmp[1]; 
        print "$type" ; #to test, but i have a hashmap which i load them in and print at the end of the file. 

Благодарности

+0

есть петля вокруг, если/ELSIF ? У вас есть все данные в памяти или только одна строка? – perreal

+0

У меня есть оператор печати внутри цикла foreach, который я использовал для тестирования, просто пропущенного в этом сообщении. Обычно я загружаю данные в хэш. Но я еще не получил этого, так как простой оператор печати не дает мне то, что я хочу. Цикл дает ADDRESS (столько раз, сколько он есть в текстовом файле) –

ответ

0
use warnings; 
use strict; 

while(<DATA>) { 
    if (/^ADDRESS/) {   # if line contains ADDRESS then read addresses 
     while (<DATA>) {  # ... in a loop 
      last if !/^ +/;  # until we find a non-indented line 
      print $_;   # here you can push $_ to a list 
     } 
    } 
    if ($_ && /^TYPE/) {  # a TYPE after address can be processed now 
     # stuff 
    } 
} 

__DATA__ 
TYPE: Travel 
ADDRESS 
    Barcelona 
    Paris 
TYPE: Travel 
ADDRESS 
    Barcelona 
    Paris 

Производит:

Barcelona 
    Paris 
    Barcelona 
    Paris 
+0

Благодарим вас за ответ и время. Есть ли способ, на который вы могли бы ответить, основываясь на том, что у меня уже есть в коде? Существует стиль, который я использую, чтобы использовать ваши, меня пугает, поскольку я новичок в perl и программировании. Кстати, есть другие атрибуты выше «ТИП», я просто дал небольшой обзор DataSet.I покажу вам, как я обработал Type. Я только что отредактировал вопрос и добавил. –

+0

Вы не можете разбить линию ADDRESS, эта строка содержит только одно слово. Попытайтесь понять код, который у меня выше. Если ни один другой атрибут, кроме ADDRESS, не распространяется на несколько строк, вы можете просто прикрепить их как инструкции elsif к блоку TYPE. – perreal

+0

АДРЕС - последний из записей (ТИП И АДРЕС были только двумя последними записями, которые я решил показать здесь). Каждая следующая новая запись начинается после пробела с «TIME», который следует. Я обработал «TIME» и другие атрибуты. Именно этот АДРЕС я не могу заставить регулярное выражение получить значения и отбросить «АДРЕС» среди его результатов. –

0

Попробуйте что-то вроде этого:

Он будет печатать строки, если предыдущая строка соответствует /^ADDRESS/. Дайте мне знать, если есть точка, в которой вы хотите остановиться, и я могу настроить ...

use warnings; 
use strict; 

my $current_line = ""; 
my $line_count = 0; 

while (<IN>){ 
    chomp; 
    my $previous_line = $current_line; 
    $current_line = $_; 
    if ($previous_line =~ /^ADDRESS/ or $line_count > 0){ 
    $line_count++; 
    print "$current_line\n" 

    } 
} 
+0

Благодарим вас за ответ. Я боюсь, мне понравится придерживаться формата, который я использовал. вы можете посмотреть, как я обработал TYPE, например. ADDRESS является последним из записей. Новая запись начинается после пробела. –