%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
