Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Ficheros y Directorios en Perl

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Jue Ago 31, 2006 7:07 am
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 239
Ubicación: Colombia
Ficheros y Directorios en Perl Responder citando

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.
Mensaje Jue Ago 31, 2006 8:03 am
monoswim
Vive para Perl en Español
Vive para Perl en Español
Registrado: 18 Nov 2003
Mensajes: 716
Ubicación: Buenos Aires
Responder citando

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:

foreach my $elem (){
  if (-d $elemento){
    print "es un directorio";
  }else{
    print "es un archivo";
  }
}


Espero que te sirva

Saludos
Mensaje Jue Ago 31, 2006 12:45 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola:

Se me ocurre que puedes hacer algo así:

Perl:
#!/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;


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
Mensaje Jue Ago 31, 2006 1:31 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

Esta es mi propuesta. Introducir el fichero por delante o por detrás.
Perl:
#!/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;

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).
Mensaje Jue Ago 31, 2006 5:34 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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:

Perl:
#!/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;

}


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:

          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. Very Happy


Saludos
Mensaje Jue Ago 31, 2006 7:09 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

Si querés organizarlo, aquí tres ejemplos.
Smile
Mensaje Vie Sep 01, 2006 7:42 pm
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 239
Ubicación: Colombia
Responder citando

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

Perl:
foreach $item (@carpeta){
  if (-d $item){
    $direcorios[$i] = $item;
$i++
  }else{
    $ficheros[$f] = $item;
$f++;
;
  }
}

sort @ficheros, @directorios;
Mensaje Dom Sep 03, 2006 7:25 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group