• Publicidad

Ejemplo de módulo Find

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Ejemplo de módulo Find

Notapor situ » 2008-10-27 13:21 @598

¿Alguien tiene un ejemplo del uso del módulo "Find" en busca de permisos del sistema tipo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
find / -type d -perm -01111 -print
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

?
Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Notapor explorer » 2008-10-27 13:28 @603

El módulo Find viene acompañado de un programa que se llama find2perl, que hace todo ese trabajo:

Código: Seleccionar todo
explorer@joaquin:~> find2perl / -type d -perm -01111 -print
#! /usr/bin/perl -w
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if 0; #$running_under_some_shell

use strict;
use File::Find ();

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;



# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/');
exit;


sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -d _ &&
    (($mode & 01111) == 01111) &&
    print("$name\n");
}

Es decir, si lo ejecutas con los mismos argumentos que los que utilizas con el comando 'find', 'find2perl' te generará un programa Perl que hará lo mismo que el comando.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2008-10-27 13:30 @604

Muchas Gracias, voy a probar el find2perl.
Saludos
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor situ » 2008-10-30 12:35 @566

Tengo el siguiente ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
find / -xdev -type d \( -perm -1000 \)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
no warnings;
use File::Find ();
open (F,">> hola.html");

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;



# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/');
exit;


sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    !($File::Find::prune |= ($dev != $File::Find::topdev)) &&
    -d _ &&
    (
        (($mode & 01000) == 01000)
    )
    &&
print "$name\n";
print F "<tr><td><font color=#f3c035 face=Verdana size=1>Informacion</font><font face=Verdana size=1> Directorio con sticky bit $name</td></tr>\n";
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

El tema es que por consola me muestra bien el resultado, pero en el HTML me imprime todos mis archivos y no solo los que tienen el Sticky Bit.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-10-30 15:48 @700

Es porque el print() hacia el fichero HTML está fuera de la comprobación lógica.

Colocando el código de otra manera, queda:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid)
        =  lstat($_))
        && !($File::Find::prune |= ($dev != $File::Find::topdev))
        && -d _
        && (
            (($mode & 01000) == 01000)
           )
        && print "$name\n"
        ;

    print F "<tr><td><font color=#f3c035 face=Verdana size=1>Informacion</font><font face=Verdana size=1> Directorio con sticky bit $name</td></tr>\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Como ves, el print() del HTML no está dentro de la lógica que decide si el fichero encontrado debe imprimirse o no, sino que se ejecuta en todos los casos.

Una solución es cambiar la línea

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        && print F qq(<tr><td><font face="Verdana" size="1"><font color="#f3c035">Información</font> Directorio con sticky bit $name</font></td></tr>\n);
        ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es decir, agregamos una condición más, añadida al resto. Como es normal que el print "$name\n" no falle, entonces también se ejecutará nuestro print() hacia el fichero HTML.

Además, he simplificado el código HTML, que tenía un error (le faltaba una marca de cierre de 'font').
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2008-10-30 16:39 @735

Gracias, ahora pude hacer que el reporte HTML sea el correcto, pero ahora en consola me aparece en número "1" por cada archivo que encuentra y no me lo muestra.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
no warnings;
use File::Find ();
open (F,">> hola.html");

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.


# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;



# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/');
exit;


sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    !($File::Find::prune |= ($dev != $File::Find::topdev)) &&
    -d _ &&
    (
        (($mode & 01000) == 01000)
    )
    &&
print "$name\n"
&& print F qq(<tr><td><font face="Verdana" size="1"><font color="#f3c035">Información</font> Directorio con sticky bit $name</font></td></tr>\n);
        ;
}

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Tienes idea el qué puede ser?
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-10-30 16:47 @741

Prueba a cambiar todos los '&&' por 'and'. Y si no funciona, prueba a poner paréntesis a los print(). Por ejemplo: print("$name\n").

El '1' que te sale es el resultado del penúltimo print(). Resulta que ese print(), lo que está viendo es una comparación lógica entre un cadena de caracteres y otro print(). Y claro, eso siempre es cierto, por eso devuelve un '1'. Y eso no es lo que queremos. Queremos una ejecución secuencial de sentencias solo si cada sentencia es precedida por una sentencia que sí se ha ejecutado.
Última edición por explorer el 2008-10-30 16:50 @743, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2008-10-30 16:49 @742

Cambié los && por and y todo funcionó perfecto.

Gracias
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-10-30 17:09 @756

Ahora, como deberes, tienes que explicar porqué ha funcionado cambiando de operador lógico, si los dos hacen lo mismo, el 'and' lógico. :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejemplo de módulo Find

Notapor situ » 2014-08-12 14:38 @651

No logro hacerlo funcionar con el IF que le agregué :?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. no warnings;
  4.  
  5. use vars qw/*name *dir *prune/;
  6. *name   = *File::Find::name;
  7. *dir    = *File::Find::dir;
  8. *prune  = *File::Find::prune;
  9.  
  10. sub wanted1;
  11.  
  12. # Traverse desired filesystems
  13. File::Find::find({wanted => \&wanted1}, '/');
  14.  
  15. sub wanted1 {
  16.     my ($dev,$ino,$mode,$nlink,$uid,$gid);
  17.  
  18.     (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) and
  19.     !($File::Find::prune |= ($dev != $File::Find::topdev)) and
  20.     -f _ and
  21.     (
  22.         (($mode & 02) == 02) and
  23.         ! (($mode & 01000) == 01000)
  24.     )and
  25.  
  26.         if ($miidioma eq "es") {
  27.                         print "probando\n";
  28.                        
  29.                 }
  30.                          
  31.                 else {
  32.                         print "testing\n";
  33.                 }
  34.        
  35. }
  36.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Siguiente

Volver a Módulos

¿Quién está conectado?

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