• Publicidad

Uso de B::Deparse

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Uso de B::Deparse

Notapor otronovato » 2013-09-11 12:58 @582

El libro de M. Brown Perl sin errores muestra cómo utilizar este módulo para ver la interpretación que hace Perl de nuestro código al aplicar los órdenes de precedencia de los distintos operadores:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -MO=Deparse, -p -e '$a + $b * $c / $d % $e'
  2. -e syntax OK
  3. ($a + ((($b * $c) / $d) % $e));
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

La documentación http://perldoc.perl.org/B/Deparse.html afirma, en efecto que:
When you use the -p option, the output also includes parentheses even when they are not required by precedence, which can make it easy to see if perl is parsing your expressions the way you intended.

Sin embargo, con mi Perl...
This is perl 5, version 14, subversion 2 (v5.14.2) built for i486-linux-gnu-thread-multi-64int (with 80 registered patches, see perl -V for more detail)

Obtengo el siguiente resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. xxxx@xxxxx:~$ perl -MO=Deparse, -p -e '$a + $b * $c /$d % $e'
  2. LINE: while (defined($_ = <ARGV>)) {
  3.     $a + $b * $c / $d % $e;
  4. }
  5. continue {
  6.     die "-p destination: $!\n" unless print $_;
  7. }
  8. -e syntax OK
  9.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

que no tiene nada que ver con lo que pretendo obtener.

Tengo además otra duda acerca de la forma de invocar a Deparse, pues la documentación sobre los switches del intérprete de Perl no indican nada sobre un parámetro 'O', mientras que invocamos a Deparse mediante -MO=Deparse en vez de -MB::Deparse como cabría esperar, si no me equivoco.

Los switches que tengo disponibles según 'perl -h' son:
Usage: perl [switches] [--] [programfile] [arguments]
-0[octal] specify record separator (\0, if no argument)
-a autosplit mode with -n or -p (splits $_ into @F)
-C[number/list] enables the listed Unicode features
-c check syntax only (runs BEGIN and CHECK blocks)
-d[:debugger] run program under debugger
-D[number/list] set debugging flags (argument is a bit mask or alphabets)
-e program one line of program (several -e's allowed, omit programfile)
-E program like -e, but enables all optional features
-f don't do $sitelib/sitecustomize.pl at startup
-F/pattern/ split() pattern for -a switch (//'s are optional)
-i[extension] edit <> files in place (makes backup if extension supplied)
-Idirectory specify @INC/#include directory (several -I's allowed)
-l[octal] enable line ending processing, specifies line terminator
-[mM][-]module execute "use/no module..." before executing program
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
-s enable rudimentary parsing for switches after programfile
-S look for programfile using PATH environment variable
-t enable tainting warnings
-T enable tainting checks
-u dump core after parsing program
-U allow unsafe operations
-v print version, patchlevel and license
-V[:variable] print configuration summary (or a single Config.pm variable)
-w enable many useful warnings
-W enable all warnings
-x[directory] ignore text before #!perl line (optionally cd to directory)
-X disable all warnings


Un saludo
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Publicidad

Re: Uso de B::Deparse

Notapor explorer » 2013-09-11 17:54 @787

Sobra el espacio en blanco que hay entre la coma y el '-p':
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -MO=Deparse,-p -e '$a + $b * $c /$d % $e'
  2. ($a + ((($b * $c) / $d) % $e));
  3. -e syntax OK
  4.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Uso de B::Deparse

Notapor otronovato » 2013-09-12 11:49 @534

:oops:

En cuanto a la forma:

-MO=Deparse,-p


Entiendo que se trata de este tipo que recoge perlrun:

-[mM][-]module=arg[,arg]...


Pero entonces el nombre del módulo sería 'O', y 'Deparse,-p' sólo parámetros que le pasamos a ese módulo. Al buscar perldoc -m O obtengo lo siguiente:

O - Generic interface to Perl Compiler backends

=head1 SYNOPSIS

perl -MO=[-q,]Backend[,OPTIONS] foo.pl

(...)

In summary, a compiler backend module should be called "B::Foo"
for some foo and live in the appropriate directory for that name.
It should define a function called C<compile>. When the user types

perl -MO=Foo,OPTIONS foo.pl

that function is called and is passed those OPTIONS (split on
commas).


Pero no entiendo para qué sirve el módulo 'O', ni por qué no se puede invocar directamente el módulo B::Deparse.

A no ser que sea el módulo 'O' el que nos permite cargar un módulo con los parámetros necesarios, en este caso '-p'. ¿Es éso?

Un saludo y muchas gracias
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Uso de B::Deparse

Notapor explorer » 2013-09-12 16:01 @709

Yo, apenas he tocado este tema (mejor dicho, nada). Y el caso es que todo esto es muy interesante.

B::Deparse es uno de los varios módulos que existen para comunicarse con el compilador de Perl.

Cuando arrancamos un programa Perl, el intérprete perl inicia dos fases (dicho así para simplificar). La primera fase es la interpretación del código y compilación a bytecode, y la segunda fase, la ejecución de ese bytecode.

El caso es que con el módulo O podemos "enlazar" el compilador interno de perl con otro módulo externo. En este caso, B::Deparse, que lo que hace es generar código Perl a partir de la estructura interna que perl genera después de la interpretación del código.

Tienes información del módulo O con perldoc O, y del otro módulo con perldoc B::Deparse.

Y sí: las opciones separadas con comas son las que modifican el comportamiento del módulo.

En la documentación verás que la opción '-p' sirve para imprimir "paréntesis extra" en las expresiones, cuando lo normal es que solo lo haga cuando (el cree que) es necesario.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado