#!/usr/bin/perl use strict; use Parse::RecDescent; use File::Slurp; use Data::Dumper; $Data::Dumper::Indent = 1; $::RD_HINT = 1; my $text = read_file( 'escrima.dump' ); my $parser = Parse::RecDescent->new( <<'END_GRAMMAR' ); hex_digit: /[abcdefABCDEF0123456789]/ uuid: 'UUID: ' ( hex_digit(8) '-' hex_digit(4) '-' hex_digit(4) '-' hex_digit(4) '-' hex_digit(12) ) "\n" number: /\d+/ newline: /\n|\r\n|\x0A|\x0D|\x0D\x0A/ key: "K " number newline { print ::Dumper({%item}); my $len = $item{number}; $return = substr( $text, 0, $len, "" ); print ::Dumper([$return,$text]);} value: "V " number newline { print ::Dumper({%item}); my $len = $item{number}; $return = substr( $text, 0, $len, "" ); print ::Dumper($text);} kv_pair: key value property_block: kv_pair(1..) 'PROPS-END' newline dumpfile: key value revision: revision_header "\n" property_block "\n" node(1..) revision_header: 'Revision-number: ' number "\n" 'Prop-content-length: ' number "\n" 'Content-length: ' number "\n" node: /.*/ END_GRAMMAR die "Bad Grammar!" unless defined $parser; $text = "K 7 svn:log V 13 Inital import "; my $foo = " K 10 svn:author V 6 immute K 8 svn:date V 27 2006-08-30T23:08:39.850827Z"; my $result = $parser->dumpfile( $text ); die "Bad Result!" unless defined $result; print Dumper( $result );