• Publicidad

Duda con la función local

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Duda con la función local

Notapor Nihu » 2009-02-02 11:18 @513

Buenas, encontré el siguiente código que lo necesitaba para una práctica pero no sé para qué sirve exactamente hacer el "local(*DIR);", a ver si alguien lo tiene claro.
Gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($dir) = @ARGV;
  $dir = "." unless $dir;
  &loopDir($dir, "");
  exit;
sub loopDir {
   local($dir, $margin) = @_;
   chdir($dir) || die "Cannot chdir to $dir\n";

   local(*DIR);
   opendir(DIR, ".");
   while ($f=readdir(DIR)) {
      next if ($f eq "." || $f eq "..");
      print "$margin$f\n";
      if (-d $f) {
         &loopDir($f,$margin."   ");

      }
   }
   closedir(DIR);
   chdir("..");
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Nihu
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-02-02 11:01 @500

Publicidad

Notapor explorer » 2009-02-02 11:52 @536

Bienvenido a los foros de Perl en Español, Nihu.

local() da valores temporales a variables globales (en el entorno del paquete).

En el ejemplo puesto, lo que hace la línea es "localizar" todo el espacio de nombres de DIR (DIR como filehandle, $DIR, @DIR, %DIR y &DIR). Los antiguos valores de estas variables son preservados hasta que termine el contexto en donde estamos (para ser recuperados), y se crea espacio para que almacenen nuevos valores. No se crean variables locales (a pesar del nombre), sino que, temporalmente (localmente, "ahí"), esas variables almacenarán un valor distinto al que tenían.

Esto es lo que se hacía hace años. Ahora es más aconsejable usar my(). local() queda para cuando quieres modificar una variable especial en un contexto pequeño y recuperar su valor anterior después.

Ejemplo: en el siguiente trozo de código queremos leer todo el fichero de golpe, todas las líneas, a una variable escalar. Para ello, modificamos la variable especial $/, con un nuevo valor, pero "recordando" el valor que tenía antes, para que no afecte al funcionamiento de operaciones ulteriores.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fichero;
{
    open my $fh, "foo" or die $!;
    local $/ = undef;   # Indefinimos el valor del separador de registros
    $content = <$fh>;
    close $fh;
}
# aquí, $/ vuelve a recuperar su valor original
# y no afectará a otras operaciones de lectura
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en perlsub # Temporary Values via local()
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Nihu » 2009-02-02 12:14 @551

Entendido. Yo pensaba que reservaba las variables locales.
Muchas gracias explorer.
Nihu
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-02-02 11:01 @500


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 6 invitados

cron