• Publicidad

Ficheros y Directorios en Perl

¿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.

Ficheros y Directorios en Perl

Notapor danimera » 2006-08-31 08:07 @380

Bueno mi sistema Funciona bien a la hora de leer los directorios y los ficheros,

Pero me gustaria saber, como haria para organizar que los directorios o carpetas me quedaran primero que los archivos y no me los mezcle.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Notapor monoswim » 2006-08-31 09:03 @418

Yo para hacer eso hice un bucle que verificaba elemento por elemento si era un archivo o un directorio, y en tal caso los colocaba en un array diferente...

con -d sabes si es un directorio

Código: Seleccionar todo
foreach my $elem (){
  if (-d $elemento){
    print "es un directorio";
  }else{
    print "es un archivo";
  }
}


Espero que te sirva

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor kidd » 2006-08-31 13:45 @614

Hola:

Se me ocurre que puedes hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;


my $READ_DIR = "/home/my/dir/";


opendir DIR, $READ_DIR or die "Cannot open $READ_DIR: $!";
my @files = map  { $_->[1] }
            sort { $a->[0] <=> $b->[0] }
            map  { [ -f $READ_DIR.$_, $_ ] }
            readdir DIR;
closedir DIR;


print join "\n", @files;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Lo que hace es que te ordena el contenido del directorio de lectura, primero despliega los directorios, luego los archivos, y todo es ordenado alfabeticamente.

Si te interesa hacer el ejemplo más corto, podrías usar módulos como el Sort::Maker o el Sort::Key


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor explorer » 2006-08-31 14:31 @647

Esta es mi propuesta. Introducir el fichero por delante o por detrás.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l

my $directorio = '.';
my @ficheros;

opendir(DIR, $directorio) or die "ug!";
while ( $file = readdir DIR ) {
    unshift @ficheros, $file if -d "$directorio/$file";
    push    @ficheros, $file if -f _;
}
closedir DIR;

print join "\n", @ficheros;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La comprobación de si es directorio o fichero sólo se realiza una vez, gracias a la extraña variable especial "_", que guarda los valores de stat del último archivo testeado por alguna operación de test de ficheros (en este caso, -d).
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 kidd » 2006-08-31 18:34 @815

Me pareció interesante la propuesta que mostró explorer, así que decidí hacerle una comparación con la mia, usando el módulo Benchmark.

El código que utilicé es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use Benchmark qw(:all) ;


my $directorio = '/home/dir/test/';
my $count;

    cmpthese($count, {
        'kidd' => \&kidd,
        'explorer' => \&explorer,
    });



sub kidd{

opendir DIR, $directorio or die "Cannot open $directorio: $!";
my @files = map  { $_->[1] }
            sort { $a->[0] <=> $b->[0] }
            map  { [ -f $directorio.$_, $_ ] }
            readdir DIR;
closedir DIR;

}


sub explorer{

my @ficheros;

    opendir(DIR, $directorio) or die "ug!";
    while ( my $file = readdir DIR ) {
       unshift @ficheros, $file if -d "$directorio/$file";
       push    @ficheros, $file if -f _;
    }
    closedir DIR;

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Antes de empezar, el resultado que yo esperaba es que la solución de explorer fuera más lenta por el costo de estar haciendo el push() y el unshift() pues el resto es básicamente lo mismo.

Aquí están los resultados:
Código: Seleccionar todo
          Rate     kidd explorer
kidd     168/s       --      -5%
explorer 177/s       5%       --


          Rate     kidd explorer
kidd     168/s       --      -6%
explorer 178/s       6%       --


          Rate     kidd explorer
kidd     169/s       --      -5%
explorer 178/s       5%       --


Así que estaba equivocado, realmente es poca la diferencia que hay entre los dos. Pero de nuevo, depende del tamaño de tu directorio, pues entre más archivos, más incrementa la diferencia de velocidad. :D


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor creating021 » 2006-08-31 20:09 @881

Si querés organizarlo, aquí tres ejemplos.
:)
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

Notapor danimera » 2006-09-01 20:42 @904

Bueno bueno gracias por todas esas formulas no era para tanto, aunque encontre una simple:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach $item (@carpeta){
  if (-d $item){
    $direcorios[$i] = $item;
$i++
  }else{
    $ficheros[$f] = $item;
$f++;
;
  }
}

sort @ficheros, @directorios;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor kidd » 2006-09-03 20:25 @892

Hola:

Ah, es que cambian mucho las cosas si deseas separar los elementos en dos arrays distintos, pues eso es muy sencillo, lo complicado era si querias enlistarlos todos por order de directorios primero y después archivos.

Pero, que bueno que al final lograste lo que querias.

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron