• Publicidad

Duda con función

¿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 función

Notapor creating021 » 2007-11-03 16:31 @730

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# By John Bazik
#
# Usage: $cwd = &fastcwd;
#
# This is a faster version of getcwd.  It's also more dangerous because
# you might chdir out of a directory that you can't chdir back into.
   
sub fastcwd_ {
    my($odev, $oino, $cdev, $cino, $tdev, $tino);
    my(@path, $path);
    local(*DIR);

    my($orig_cdev, $orig_cino) = stat('.');
    ($cdev, $cino) = ($orig_cdev, $orig_cino);
    for (;;) {
        my $direntry;
        ($odev, $oino) = ($cdev, $cino);
        CORE::chdir('..') || return undef;
        ($cdev, $cino) = stat('.');
        last if $odev == $cdev && $oino == $cino;
        opendir(DIR, '.') || return undef;
        for (;;) {
            $direntry = readdir(DIR);
            last unless defined $direntry;
            next if $direntry eq '.';
            next if $direntry eq '..';

            ($tdev, $tino) = lstat($direntry);
            last unless $tdev != $odev || $tino != $oino;
        }
        closedir(DIR);
        return undef unless defined $direntry; # should never happen
        unshift(@path, $direntry);
    }
    $path = '/' . join('/', @path);
    if ($^O eq 'apollo') { $path = "/".$path; }
    # At this point $path may be tainted (if tainting) and chdir would fail.
    # Untaint it then check that we landed where we started.
    $path =~ /^(.*)\z/s         # untaint
        && CORE::chdir($1) or return undef;
    ($cdev, $cino) = stat('.');
    die "Unstable directory path, current directory changed unexpectedly"
        if $cdev != $orig_cdev || $cino != $orig_cino;
    $path;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Eso es de Cwd.pm
¿Cómo funciona? (no lo entiendo).
¿Cómo puede dar el path con sólo ver los inodos y los dev?

Gracias.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

No lo ve solo los inodes y dev

Notapor Jenda » 2007-11-04 05:41 @278

Actualmente lo usa los inodes y dev solo para poder encontrar el directorio entre los contenidos de su antepasado.

La función siempre recuerda el inode y dev del . , cambia al antepasado directorio y busca el reglón con el mismo inode y dev y guarda su nombre. Y sigue recordando, cambiando, buscando y guardando al arribar al raíz.
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor creating021 » 2007-11-04 10:19 @472

Gracias Jenda.

Buscando en la wikipedia (inodo) veo muchas cosas, aún así no entiendo como puede sacar el nombre (el código solo compara los inodos).

Una pregunta más... ¿Este código cuan portable es?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Lee sobre opendin() y readdir()

Notapor Jenda » 2007-11-04 12:03 @544

El readdir() es lo que saca el nombre. Es código abre cada directorio con opendir() y lees los nombres de los ficheros y por cada fichero compara los inodes y devs con los del . del directorio pasado.

Así que de primero guarda los inode y dev del directrio actual ( stat('.') ), después abre el directorio más alto, lee todos los ficheros y directorios en él y busca el directorio que tiene los inode y dev del original .

No sé cuan portable es, espero que los docs de Cwd.pm contiene este información.

Jenda
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados