#!/usr/bin/perl use strict; use warnings; package PodParser; use base qw( Parser::MGC ); sub parse { my $self = shift; $self->sequence_of( sub { $self->any_of( sub { my ( undef, $tag, $delim ) = $self->expect( qr/([A-Z])(<+)/ ); $self->commit; +{ $tag => $self->scope_of( undef, \&parse, ">" x length $delim ) }; }, sub { $self->substring_before( qr/[A-Z]</ ) }, ) }, ); } use Data::Dumper; if( !caller ) { my $parser = __PACKAGE__->new; while( defined( my $line = <STDIN> ) ) { my $ret = eval { $parser->from_string( $line ) }; print $@ and next if $@; print Dumper( $ret ); } } 1;