%ENV
. En el ejemplo que sigue ataremos
variables escalares Perl a las correspondientes variables de entorno
con el mismo nombre,
de manera que la modificación de la variable Perl atada conlleve la
modificación de la variable de entorno:
1 package Myenv; 2 3 sub import { 4 my ($callpack) = caller(0); # nombre del paquete que usa a esta rutina 5 my $pack = shift; 6 my @vars = grep /^[A-Za-z_]\w*$/, (@_ ? @_ : keys(%ENV)); 7 return unless @vars; 8 9 foreach (@vars) { 10 tie ${"${callpack}::$_"}, Myenv, $_; 11 } 12 } 13 14 sub TIESCALAR { 15 bless \($_[1]); 16 } 17 18 sub FETCH { 19 my ($self) = @_; 20 $ENV{$$self}; 21 } 22 23 sub STORE { 24 my ($self, $value) = @_; 25 if (defined($value)) { 26 $ENV{$$self} = $value; 27 } else { 28 delete $ENV{$$self}; 29 } 30 } 31 32 1;La función
import
obtiene en la línea 4 el nombre del paquete
que usa Myenv
. Después, si se han explicitado argumentos
en el pragma use
se dejan en @vars
(línea 6) y si no
@vars
es inicializada con todas las claves del hash %ENV
.
Repase la sección 5.7 para mas detalles sobre
el proceso de importación. En el bucle de las líneas 9-11
instalamos en la tabla de símbolos del paquete usuario las
entradas a las variables de entorno.
Sigue el programa de uso:
#!/usr/bin/perl -d use Myenv qw(HOME); print "home = $HOME\n"; $HOME = "/tmp/"; system 'echo $HOME';y su ejecución con el depurador:
$ ./env.pl Default die handler restored. Loading DB routines from perl5db.pl version 1.07 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(./env.pl:4): print "home = $HOME\n"; DB<1> s Myenv::FETCH(Myenv.pm:19): my ($self) = @_; DB<1> Myenv::FETCH(Myenv.pm:20): $ENV{$$self}; DB<1> x $self 0 Myenv=SCALAR(0x811fa8c) -> 'HOME' DB<2> home = /home/lhp main::(./env.pl:5): $HOME = "/tmp/"; DB<2> s Myenv::STORE(Myenv.pm:24): my ($self, $value) = @_; DB<2> Myenv::STORE(Myenv.pm:25): if (defined($value)) { DB<2> Myenv::STORE(Myenv.pm:26): $ENV{$$self} = $value; DB<2> main::(./env.pl:6): system 'echo $HOME'; DB<2> /tmp/ Debugged program terminated. Use q to quit or R to restart, use O inhibit_exit to avoid stopping after program termination, h q, h R or h O to get additional info.
Casiano Rodríguez León