Как я могу перейти к следующей строке после того, как условие выполнено в Perl? - PullRequest
2 голосов
/ 29 июня 2009

Ниже приведены данные, над которыми я работаю:

__DATA__

Node 1: 

        98 debug : fill 100 
       102 debug : fill 104
Node 2:

        88 debug : fill 120 
       152 debug : fill 164

Я хочу написать регулярное выражение / (или любое другое подходящее) для сбора информации из данных ниже Узла 1, скажем, «98: 100», но только после идентификации Узла 1 и сохранения ее в массиве, скажем @ value1 (т.е. значения в @ value1 соответствуют данным ниже узла 1). И аналогичным образом собирать и хранить информацию из данных ниже узла 2, скажем, 152: 164, после того, как узел 2 был идентифицирован в другом массиве, скажем, «@ значение2». Регулярное выражение, которое я использую для сбора информации: "qr/\s+([0-9]{2,3})\s[a-z]+\s(:)\s[a-z]\s([0-9]{3})/". Но если я использую оператор «если»

    while (<>){
     if ($_=~ /Node 1/){
     #capture information using regex
     }
    }   

перед регулярным выражением, скрипт не возвращает никакого значения, вероятно, потому что он ищет или повторяет регулярное выражение в той же строке после слова «Узел».

Любые предложения о том, как перейти к следующей строке после идентификации конкретного узла и сбора информации с помощью регулярных выражений.

Ответы [ 3 ]

5 голосов
/ 29 июня 2009

Ваш вопрос немного сбивает с толку. Кажется, вы хотите использовать символические ссылки, но вам лучше использовать хеш. См. Также «Почему глупо использовать переменную в качестве имени переменной» части 1 , 2 и 3 .

#!/usr/bin/perl

use strict;
use warnings;

my %data;

my $current_node;

while ( <DATA> ) {
    /^Node ([0-9]+):/ and $current_node = $1 and next;
    if ( /^\s+ ([0-9]+) \s debug \s : \s fill \s ([0-9]+)/x ) {
        push @{ $data{"value$current_node"} }, "$1 : $2";
    }
}

use Data::Dumper;
print Dumper \%data;

__DATA__

Node 1:

        98 debug : fill 100
       102 debug : fill 104
Node 2:

        88 debug : fill 120
       152 debug : fill 164
3 голосов
/ 30 июня 2009

Вы также можете анализировать один узел за раз в хэш, как это:

local $/ = "\nNode ";

while ( <DATA> ) {
    chomp; s/^Node //;  # remove 1st Node header
    my ($current_node) = /^(\d+):/;
    map {
        if (/^\s+ ([0-9]+) \s debug \s : \s fill \s ([0-9]+)/xm ) {  # borrowed from Sinan
           push @{ $data{"value$current_node"} }, "$1 : $2";
       }
    } split /\n/;
}

Это более полезно в тех случаях, когда разделитель записи [Node] является константной строкой и $current_node может быть похоронен где-то в самой записи.

1 голос
/ 29 июня 2009

Редактировать : Хотя этот ответ точный, он пропускает большую часть вопроса.


Используйте next, чтобы перейти к следующей итерации цикла; используйте last, чтобы выйти из цикла. Если вы пометили (вложенные) циклы, вы можете использовать next LABEL; для перехода к следующей итерации именованного цикла и т. Д.

Сравните continue и break на C и аналогичных языках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...