Acceso a las variables de entorno

Perl proporciona acceso a las variables de entorno a través del hash %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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19