Página 1 de 1

Ficheros y Directorios en Perl

NotaPublicado: 2006-08-31 08:07 @380
por danimera
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.

NotaPublicado: 2006-08-31 09:03 @418
por monoswim
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

NotaPublicado: 2006-08-31 13:45 @614
por kidd
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.005 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

NotaPublicado: 2006-08-31 14:31 @647
por explorer
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.002 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).

NotaPublicado: 2006-08-31 18:34 @815
por kidd
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

NotaPublicado: 2006-08-31 20:09 @881
por creating021
Si querés organizarlo, aquí tres ejemplos.
:)

NotaPublicado: 2006-09-01 20:42 @904
por danimera
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

NotaPublicado: 2006-09-03 20:25 @892
por kidd
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