[Moscow.pm] Парсинг вот такой вот структуры

Ruslan Zakirov ruslan.zakirov на gmail.com
Пн Ноя 16 08:39:49 PST 2009


Привет,

Если нужно сделать один раз, то можно через eval или заточенными под
результат регэкспами.

Для постоянного общения с сервером лучше написать грамматику,
используя Parse::RecDescent или другие генераторы парсеров. Если у вас
perl 5.10, то вам стоит посмотреть на Regexp::Grammars.

Еще можно написать свой парсер на машинке состояний. Его очень легко
написать, если нет возвратов. Если каждый элемент однозначно
определяет последующую структуру, то значит возвратов не будет.
Выглядит все это так:

use constant TOKEN1  => 1;
use constant TOKEN2  => 2;
use constant TOKEN3  => 4;

sub parse {
    ...
    # States
    my $want = TOKEN1 | TOKEN2 | ...; # начало строки
    my $last = 0;
    my $depth = 0;
    while(1) {
        if ( $string =~ /\G\s+/gc ) {
        }
        elsif ( ($want & TOKEN1) && $string =~ /$self->{'mre_token1'}/gc ) {
            $callbacks->{'token1'}->( $1 );
            $last = TOKEN1;
            $want = TOKEN2 | TOKEN3; # возможные токены после токена 1
        }
        elsif ( ... ) {
        }
        elsif ( ... ) {
        } else {
           die "something not expected";
        }
    }
}

Полный пример есть на CPAN в Parse::BooleanLogic.

2009/11/16 Pavel <brosku на mail.ru>:
> Приветствую, коллеги!
> Столкнулся с одной задачкой, но прежде чем изобретать велосипед,
> хотел бы обратиться к сообществу.
> Есть сервер отвечающий на запросы вот таким вот текстом (между тире):
> ---------------------------------------
> TYPE1=[
> { ID=One NAME="Один айди" }
> { ID=Two NAME="Айди номер два" }
> { ID=Some NAME="Еще что-то" }
> { ID=Yeah NAME="Вот так вот" }
> ]
> TYPE2=[
> ]
> ----------------------------------------
> Задача состоит в том чтобы спарсить подобные ответы в структуры perl (хэши,
> массивы, ...) (ответы могут различаться по структуре, иметь вложенные
> массивы данных, и т.п.)
> В принципе всевозможные комбинации конечны, и можно написать n-ное кол-во
> регэкспов которые будут парсить
> этот вывод, но возможно есть какие-то решения наподобие модулей
> Config::Any::INI, которые позволяют обрабатывать подобные структуры и
> получать на выходе структуры perl?
> Спасибо.
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm