• Publicidad

El comando chdir no funciona

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

El comando chdir no funciona

Notapor STM » 2011-03-23 11:22 @515

Buen día,

Estoy haciendo un pequeno programa para recuperar una línea según un patrón dado en una lista de archivos.

Tengo aproximadamente 100000 archivos donde existe una línea que comienza por la palabra "data" luego aprox. 120 espacios y luego hay un número. En realidad yo quiero recuperar estos valores.

Sin embargo, Perl genera un error cuando trato de leer los archivos. Perl dice que no puede abrir la carpeta donde se encuentran los archivos: chdir($diry)|| die ('It couldnt be:'.$diry.$!."\n");

¿Podrían decirme por favor dónde está el error en el código?

Otra pregunta que tengo es que en mis archivos siempre hay dos líneas que empiezan con la palabra "data" pero yo solo quisiera recuperar la primera línea.

¿Podrían decirme cómo se le indica esto en Perl?

Muchas gracias de antemano por su ayuda.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use strict;
  3. use warnings;
  4. use Cwd;  
  5. $dir= getcwd;
  6.  
  7. $folder="folder1";
  8. ##################
  9. $file=$dir."/lista";
  10. #########
  11. open (FILE ,$file)|| die ("It couldnt be open");
  12. @arrayin1=<FILE>;
  13. open (FIL,">>OUTFILE.txt")|| die ("It could not be open:OUTFILE.txt $!");
  14.  
  15. for ($iii=0; $iii<@arrayin1; $iii++ ) {
  16.  
  17. $diry=$dir."/".$folder."/".$arrayin1[$iii];
  18.  
  19. chdir($diry)|| die ('It couldnt be:'.$diry.$!."\n");
  20.  
  21.  
  22.  
  23. open (PAGE ,"$diry")|| die ('It couldnt be open:'.$diry.$!."\n");
  24.  
  25. @arrayentrada=<PAGE>;
  26.  
  27.        
  28. for ($j=0; $j<@arrayentrada; $j++ )
  29. {  
  30.  
  31.         if($arrayentrada[$j]=~ m/data1/)
  32.          
  33.         {
  34.         #print $arrayentrada[$j]."\n";
  35.         $data29=$arrayentrada[$j];
  36.          print FIL $arrayin1[$iii].'='.$data29;
  37.         }
  38.        
  39.  
  40. #$hehe=<STDIN>;
  41.  
  42. }#arrayentrada
  43. }#arrayin1
  44.  
  45. close FIL;
  46. close FILE;
  47. close PAGE;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
STM
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2008-07-01 07:12 @342

Publicidad

Re: El comando chdir no funciona

Notapor pvaldes » 2011-03-23 12:12 @550

Puede que esté aquí:

$dir."/lista";

Revisa que el punto y la barra delante de lista no estén creando problemas al traducir el fichero.

Probablemente sea mejor usar una estructura distinta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  opendir(DIRECTORIO, "midirectorio");
  @listadearchivos= readdir(<DIRECTORIO>);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y luego usar un bucle normal
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 foreach my $valor(@listadearchivos){
    # hacer algo...
}
closedir <DIRECTORIO>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: El comando chdir no funciona

Notapor explorer » 2011-03-24 13:30 @604

Yo, lo que veo es lo siguiente: en la línea 19 estás intentando entrar en un subdirectorio contenido en la variable $diry, pero luego, en la línea 23 estás intentando abrirlo como si fuera un fichero de texto.

Entonces, en la mayoría de los sistemas de ficheros, eso quiere decir que una de las dos líneas generará un error, porque, o bien $diry contiene la ruta completa a un fichero (y fallará la primera línea porque un fichero no es un directorio y chdir() no puede entrar en él), o bien contiene la ruta completa a un directorio (y fallará entonces la segunda línea, al intentar abrir un directorio como si fuera un fichero).
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

Re: El comando chdir no funciona

Notapor STM » 2011-03-25 08:20 @389

Hola,
Muchas gracias a pvaldes y a explorer por sus respuestas. El script ya funciona.

Ahora quisiera formular una nueva pregunta.

En mi archivo yo tengo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
data 2.1569
data -2.1569
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Yo quisiera tratar cada línea de una forma diferente dependiendo si el número es positivo o negativo.

Sin embargo no sé cómo escribir esto en Perl.

Mi idea es algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (j=0; $j<@arrayentrada; $j++)
  2. {
  3.   if (arrayentrada[$j] =~ m/data/)
  4.   {
  5.     $_=$data[2];
  6.   }
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Hasta aquí el código detecta el número pero no sé cómo detectar el signo del número.

¿Podrían decirme cómo se puede hacer esto?

Gracias.

STM
STM
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2008-07-01 07:12 @342

Re: El comando chdir no funciona

Notapor explorer » 2011-03-25 09:20 @431

Si @arrayentrada contiene las líneas del fichero, basta con leerlas una a una, partirlas por el espacio en blanco, y ver el signo del número:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for (@arrayentrada) {
    chomp;

    my ($data, $numero) = split " ";

    if ($data =~ /^data/) {
        if ($numero < 0) {
            print "El número $numero es negativo\n";
        }
        else {
            print "El número $numero es positivo\n";
        }
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Naturalmente, el if() del $data sobra si todas las líneas comienzan por 'data'.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados

cron