El Módulo O

El módulo O se limita a compilar el módulo backend (el módulo 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
2012-02-29