#!/usr/bin/perl use Parse::RecDescent; use strict; use Data::Dumper; $::RD_ERRORS = 1; # Make sure the parser dies when it encounters an error $::RD_WARN = 1; # Enable warnings. This will warn on unused rules &c. $::RD_HINT = 1; # Give out hints to help fix problems. # Create and compile the source file my $rules; my $parser = Parse::RecDescent->new( q( get_type : type { $item{ type } } type : /^[^,]+/ comma : "," date : /\d\d\/{2}\d\d/ start_date : date end_date : date time : /\d\d:{2}\d\d/ rate : /\d+\.\d{4}/ start_rate : rate end_rate : rate change : rate whitespace : /\s*/ G017RATEBRKRL : type comma rate comma start_date comma end_date comma time { return \%item } G017CP111_D : type comma start_rate comma end_rate comma change comma date comma time { \%item } G017RPAGO_N : type comma rate comma whitespace comma whitespace comma date comma time { \%item } G017ONFD : type comma rate comma rate comma rate comma rate comma rate comma rate comma date comma time { \@item } G017PDFF : type comma rate comma rate comma rate comma rate comma date comma time { \@item } ) ); while ( chomp( my $quote_data = ) ) { next if $quote_data !~ /\S/; my $quote_type = $parser->get_type( $quote_data ); next if ! defined $quote_type; $quote_type =~ s/\W/_/g; print "* $quote_type : $quote_data *\n"; if ( defined $quote_type ) { my $data = $parser->$quote_type( $quote_data ); # <-- this doesn't work :( if ( defined $data ) { print Dumper $data; } else { print "\$data is undefined for $quote_type\n"; } } } __DATA__ G017RATEBRKRL,4.2500,10/2/01,10/05/01,16:40:57 G017CP111 D,2.3800,2.3300,0.0001,10/05/01,16:40:55 G017RPAGO/N,2.4300, , ,10/05/01,16:40:58 G017ONFD,2.3125,2.3750,2.4375,2.3750,2.4375,2.2500,10/05/01,16:40:56 G017PDFF,2.5000,2.7500,2.2500,2.5000,10/05/01,16:40:56