#!/usr/bin/perl use strict; use warnings; use Parse::RecDescent; use Data::Dumper; #$::RD_AUTOACTION = q { print $item[0]."=".$item[1]."\n" }; my $parser=Parse::RecDescent->new(<<'__END_OF_GRAMMAR__'); # line: time load cpus avg_time avg_load eof {\%item} time: int load: int avg_time: int avg_load: int #Recursively build a list of cpus based on the number of cpus reported cpus: cpu_num cpu_list[ $item{cpu_num} ] { $return=[ $item[0], $item[2] ] } cpu_list: { $arg[0] == 0 ? $return=[] : undef } | cpu_elem cpu_list[ $arg[0]-1 ] { $return=[ $item[1], @{$item[2]} ] } cpu_elem: int cpu_num: int int: /\d+/ eof: /\Z/ __END_OF_GRAMMAR__ my @input=( "10 12 4 3 2 9 2 7 567", "8 9 3 1 2 3 8 8", "6 2 1 1 4 8", "6 2 0 1 4", ); foreach my $input(@input){ print Dumper($parser->line($input)); };