<score: ...>
toma como argumento
una expresión numérica que indica la prioridad de la
producción. La directiva lleva un <reject>
asociado.
La producción con puntuación mas alta es elegida (salvo
que hubiera otra que hubiera aceptado directamente).
El problema anterior puede ser resuelto como sigue:
#!/usr/local/bin/perl5.8.0 -w use strict; use Parse::RecDescent; use Data::Dumper; #$::RD_TRACE = 1; my $grammar = q{ line : <leftop: value ',' value> <score: @{$item[1]}> | <leftop: datum ':' datum> <score: @{$item[1]}> | <leftop: field ";" field> <score: @{$item[1]}> value: /[^,]*/ datum: /[^:]*/ field: /[^;]*/ }; my $parse = Parse::RecDescent->new($grammar); my $line; while ($line = <>) { print "$line\n"; my $result = $parse->line($line); if (defined($result)) { print Dumper($result); } else { print "Cadena no válida\n"; } }Al darle como entrada el fichero
$ cat file3.txt 1:2:3,3:4;44 1,2:2,3:3;33 1;2:2;3:3;44Obtenemos la ejecución:
$ ./score.pl file3.txt 1:2:3,3:4;44 $VAR1 = [ '1', '2', '3,3', '4;44 ' ]; 1,2:2,3:3;33 $VAR1 = [ '1', '2:2', '3:3;33 ' ]; 1;2:2;3:3;44 $VAR1 = [ '1', '2:2', '3:3', '44 ' ];