extract_multiple
del módulo Text::Balanced
puede ser considerada un generador de analizadores léxicos.
El primer argumento es la cadena a ser procesada y el segundo
la lista de extractores a aplicar a dicha cadena.
Un extractor puede ser una subrutina, pero también una expresión regular
o una cadena.
En un contexto de lista devuelve la lista con las subcadenas de la cadena original, según han sido
producidas por los extractores. En un contexto escalar devuelve la primera subcadena que pudo ser extraída de la cadena original. En cualquier caso, extract_multiple
empieza
en la posición actual de búsqueda indicada por pos
y actualiza el valor de pos
de manera adecuada.
Si el extractor es una referencia a un hash, deberá contener exactamente un elemento. La clave actúa como nombre del terminal o token y el valor es un extractor. La clave es utilizada para bendecir la cadena casada por el extractor.
Veamos un programa de ejemplo:
$ cat extract_variable.pl #!/usr/local/bin/perl5.8.0 -w use strict; use Text::Balanced qw( extract_variable extract_quotelike extract_codeblock extract_multiple); my $text = <<'EOS' #!/usr/local/bin/perl5.8.0 -w $pattern = shift || ''; $pattern =~ s{::}{/}g; $pattern =~ s{$}{.pm}; @dirs = qw( /usr/local/lib/perl5/5.8.0/i686-linux /usr/local/lib/perl5/5.8.0 /usr/local/lib/perl5/site_perl/5.8.0/i686-linux /usr/local/lib/perl5/site_perl/5.8.0 /usr/local/lib/perl5/site_perl /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.6.1 /usr/share/perl/5.6.1 ); for (@dirs) { my $file = $_."/".$pattern; print "$file\n" if (-e $file); } EOS ; my @tokens = &extract_multiple( $text, [ {variable => sub { extract_variable($_[0], '') }}, {quote => sub { extract_quotelike($_[0],'') }}, {code => sub { extract_codeblock($_[0],'{}','') }}, {comment => qr/#.*/} ], undef, 0 ) ; for (@tokens) { if (ref($_)) { print ref($_),"=> $$_\n"; } else { print "other things: $_\n"; } }La subrutina
extract_variable
extrae cualqueir variable
Perl válida. El primer argumento
es la cadena a ser procesada, el segundo es una cadena que especifica
un patrón indicando el prefijo a saltarse. Si se omite como en el ejemplo,
se usarán blancos. La subrutina extract_quotelike
extrae cadenas Perl en cualqueira de sus múltiples formas de
representación. La subrutina extract_codeblock
extrae un
bloque de código.
Ejecución del programa anterior:
$ ./extract_variable.pl comment=> #!/usr/local/bin/perl5.8.0 -w other things: variable=> $pattern other things: = shift || quote=> '' other things: ; variable=> $pattern other things: =~ quote=> s{::}{/}g other things: ; variable=> $pattern other things: =~ quote=> s{$}{.pm} other things: ; variable=> @dirs other things: = quote=> qw( /usr/local/lib/perl5/5.8.0/i686-linux /usr/local/lib/perl5/5.8.0 /usr/local/lib/perl5/site_perl/5.8.0/i686-linux /usr/local/lib/perl5/site_perl/5.8.0 /usr/local/lib/perl5/site_perl /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.6.1 /usr/share/perl/5.6.1 ) other things: ; for ( variable=> @dirs other things: ) code=> { my $file = $_."/".$pattern; print "$file\n" if (-e $file); } other things: