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
