Página 1 de 1

Problema al leer directorio con readdir

NotaPublicado: 2012-06-14 20:53 @911
por danimera
Resulta que tengo este código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   opendir(my $dh, $some_dir) || die "can't opendir $some_dir: $!";
  2.  
  3.         #@dirs = grep { /^\./ && -f "$some_dir/$_" } readdir($dh);
  4.         #Se lee el directorio
  5.             while(readdir $dh) {
  6.  
  7.             #Pongo en directorio si, el archivo no es un fichero y el directorio no tiene . o ..
  8.                 push (@dirs,$_) if (! -f "$some_dir/$_"  && ! /^\./);
  9.  
  10.             }
  11.             closedir $dh;
  12.  
  13.         return Dumper @dirs;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

cuando lo ejecuto en Windows me muestra los directorios, pero cuando lo ejecuto en el hosting en Linux no me saca nada, aunque parece que sí recorre los ficheros.

En Windows el mismo directorio tengo:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. $VAR1 = 'cleany_blue'; $VAR2 = 'cleany_green'; $VAR3 = 'default'; $VAR4 = 'modern'; $VAR5 = 'talabary';  


y en el hosting:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. $VAR1 = undef; $VAR2 = undef; $VAR3 = undef; $VAR4 = undef; $VAR5 = undef; $VAR6 = undef; $VAR7 = undef; 



Y tienen los permisos 755

Re: Problema al leer directorio con readdir

NotaPublicado: 2012-06-15 03:52 @203
por explorer
El problema es que estás usando versiones Perl distintas.

Sí que es cierto que readdir() está haciendo su trabajo (recorrer el directorio), pero lo que es distinto entre las versiones Perl del alojamiento y de tu casa, es que readdir() devuelva su resultado (el nombre del archivo) en la variable $_.

De la documentación de readdir():
readdir IDENTIFICADOR_DIR

Devuelve la siguiente entrada de directorio de un directorio abierto con "opendir". Si se usa en contexto de lista, devuelve el resto de las entradas en el directorio. Si no hay más entradas, devuelve el valor indefinido en el contexto escalar y la lista vacía en el contexto de lista.

Si está planeando hacer test de archivos de los valores retornados por un "readdir", más le vale anteponer el directorio en cuestión. De lo contrario, porque no hicimos un "chdir" antes, se estará probando en un archivo incorrecto.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                opendir(my $dh, $algun_dir) || die "no puedo opendir $algun_dir: $!";
  2.                @dots = grep { /^\./ && -f "$algun_dir/$_" } readdir($dh);
  3.                closedir $dh;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

A partir de Perl 5.11.2 puede usar un simple "readdir" en un bucle "while", que actualizará $_ en cada iteración.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                opendir(my $dh, $algun_dir) || die;
  2.                while(readdir $dh) {
  3.                    print "$algun_dir/$_\n";
  4.                }
  5.                closedir $dh;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El mismo lugar dice que es recomendable poner al principio del programa

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    use 5.012; # así readdir asigna a $_ en un solitario test de un while
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Entonces... puedes poner el use v5.12; si estás seguro que en el alojamiento tienen un Perl igual o superior a v5.12. Si no, te tocará cambiar la línea del while().

Re: Problema al leer directorio con readdir

NotaPublicado: 2012-06-15 16:26 @726
por danimera
Prefiero cambiar la línea de while() :P