use Parse::RecDescent; use Data::Dumper; # capture all, trim rulename $::RD_AUTOACTION = q { [@item[1..$#item]] }; undef $::RD_WARN; my $grammar = q{ classStart : class(s) class : 'class' classinfo stats stats2 stats3 classinfo : stuff stats : 'Sent' /\d+/ 'bytes' /\d+/ 'pkts' '(dropped' /\d+?,/ 'overlimits' /\d+?\)/ stats2 : stuff stats3 : stuff stuff : /.*/ }; my $code = q{ class htb 2:11 root leaf 13: prio 0 rate 3125bps ceil ..... Sent 16822354 bytes 15272 pkts (dropped 0, overlimits 0) lended: 15272 borrowed: 0 giants: 0 tokens: 38 ctokens: 38 }; $code =~ s/^\s*//g; my $parser = new Parse::RecDescent($grammar) or die $!; my $data = $parser->classStart($code)->[0]; my @stats; # extract stats foreach (@$data) { push @stats, $_->[2]; } print Dumper \@stats;