Los Paquetes CORE y CORE::GLOBAL

El Prefijo CORE

Supongamos que estamos en un paquete que ha sobreescrito un operador Perl. Por ejemplo glob. En tal caso cualquier alusión a glob dentro del paquete se referirá a la nueva versión de glob.

¿Como podemos llamar al ''viejo'' glob dentro del paquete?:

Escribiendo CORE::glob. El prefijo CORE:: se refiere a los operadores Perl pre-construidos. Los operadores Perl no residen en ninguna tabla de símbolos y por tanto no existe un módulo CORE::. La construcción CORE::operador es una mera notación para poder referirnos a las funciones del núcleo de Perl.

El Paquete CORE::GLOBAL

Como vimos en la sección 5.11 el pragma use subs permite la sustitución de un operador en el ámbito de un paquete. Si se quiere sustituir cualquier referencia (desde el paquete o fuera de él) al operador por la nueva versión es necesario declarar la nueva versión dentro del paquete CORE::GLOBAL:
$ perl -e 'BEGIN { *CORE::GLOBAL::system = sub { print "hello $_[0]\n" } } system "foo"'
hello foo
Sigue un ejemplo en el que reeemplazamos gobalmente el operador glob:
lhp@nereida:~/Lperl/src$ cat -n coreglob.pl
 1  #!/usr/local/bin/perl -w
 2  package Tutu;
 3  use strict;
 4
 5  {
 6    no warnings;
 7    *CORE::GLOBAL::glob = sub {
 8      my $regexp = shift;
 9
10      opendir my $DIR, "." or die "$!";
11      my @files = grep /$regexp/, readdir $DIR;
12      close($DIR);
13      return @files;
14    };
15  }
16  1;
17
18  package main;
19  use strict;
20
21  sub tutu {
22    my @a = glob('^.[cd][ba].*\.pl');
23    local $" = "\n";
24    return "@a\n";
25  }
26
27  print "---------main-----------\n";
28  print tutu;
ahora la llamada en el paquete main a glob encuentra la nueva versión:
lhp@nereida:~/Lperl/src$ coreglob.pl
---------main-----------
idbetcurly.pl
pcap.pl
scalar_sets.pl
scalar_sets2.pl
sdbm.pl
sdbm2.pl



Subsecciones
Casiano Rodríguez León
2009-10-04