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
Casiano Rodríguez León
