B::
) y preparar el entorno para
su ejecución.
pp2@nereida:~/src/perl/B$ sed -ne 1,58p `perldoc -l O` | cat -n 1 package O; 2 3 our $VERSION = '1.00'; 4 5 use B qw(minus_c save_BEGINs); 6 use Carp; 7 8 sub import { 9 my ($class, @options) = @_; 10 my ($quiet, $veryquiet) = (0, 0); 11 if ($options[0] eq '-q' || $options[0] eq '-qq') { 12 $quiet = 1; 13 open (SAVEOUT, ">&STDOUT"); 14 close STDOUT; 15 open (STDOUT, ">", \$O::BEGIN_output); 16 if ($options[0] eq '-qq') { 17 $veryquiet = 1; 18 } 19 shift @options; 20 } 21 my $backend = shift (@options); 22 eval q[ 23 BEGIN { 24 minus_c; 25 save_BEGINs; 26 } 27 28 CHECK { 29 if ($quiet) { 30 close STDOUT; 31 open (STDOUT, ">&SAVEOUT"); 32 close SAVEOUT; 33 } 34 35 # Note: if you change the code after this 'use', please 36 # change the fudge factors in B::Concise (grep for 37 # "fragile kludge") so that its output still looks 38 # nice. Thanks. --smcc 39 use B::].$backend.q[ (); 40 if ($@) { 41 croak "use of backend $backend failed: $@"; 42 } 43 44 45 my $compilesub = &{"B::${backend}::compile"}(@options); 46 if (ref($compilesub) ne "CODE") { 47 die $compilesub; 48 } 49 50 local $savebackslash = $\; 51 local ($\,$",$,) = (undef,' ',''); 52 &$compilesub(); 53 54 close STDERR if $veryquiet; 55 } 56 ]; 57 die $@ if $@; 58 }Se espera que el módulo
B::
provea una subrutina
con nombre compile
que procese las opciones que se le pasan
y que retorne una referencia a una subrutina la cual es usada para realizar la compilación
o la tarea que tengamos entre manos.
Obsérvese como lo llamada (línea 52) ocurre en un bloque CHECK .
Los bloques CHECK
se llaman después que Perl a terminado de construir el
árbol sintáctico y antes de que ocurra la fase de ejecución.
El módulo O
utiliza la función save_BEGINs para garantizar
que los bloques BEGIN quedan accesibles a los módulos backend B::
.
La subrutina minus_c
es el equivalente a la opción -c
de Perl. Significa que
se debe compilar pero no ejecutar el código.
Casiano Rodríguez León