Jue Ago 31, 2006 7:07 am
|
 |
danimera
Perlero Adicto

|
Registrado: 23 Jun 2005
Mensajes: 239
Ubicación: Colombia
|
|
| Ficheros y Directorios en Perl |
|
|
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. |
|
|
|
Jue Ago 31, 2006 8:03 am
|
 |
monoswim
Vive para Perl en Español

|
Registrado: 18 Nov 2003
Mensajes: 716
Ubicación: Buenos Aires
|
|
|
|
|
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 |
|

Jue Ago 31, 2006 12:45 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|

Jue Ago 31, 2006 1:31 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
|
|
|
|
|
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). |
|

Jue Ago 31, 2006 5:34 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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.
Saludos |
|

Jue Ago 31, 2006 7:09 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
|
|
|
|
|
Si querés organizarlo, aquí tres ejemplos.
 |
|
Vie Sep 01, 2006 7:42 pm
|
 |
danimera
Perlero Adicto

|
Registrado: 23 Jun 2005
Mensajes: 239
Ubicación: Colombia
|
|
|
|
|
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; |
|
|
Dom Sep 03, 2006 7:25 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|