• Publicidad

[RESUELTO]Varias dudas de novato

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

[RESUELTO]Varias dudas de novato

Notapor gerkrt » 2010-11-22 21:56 @956

Estoy empezando con Perl pero ya estoy atascado, además de que hay algunas cosas que no sé muy bien cómo van o porqué fallan:

1-Intenté hacer un script en Windows que me copiara un directorio con todos sus datos. Instalé y compilé correctamente la extensión del CPAN, sin embargo el código parece no funcionar...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use warnings;
  2. use strict;
  3. use File::Copy::Recursive;
  4.  
  5.  
  6. my $file1='C:\Users\we\Documents\dosprog\';
  7. my $file2='C:\Users\we\';
  8. File::Copy::Recursive::dircopy $file1, $file2 or die "Copy failed: $!";
  9. print 'Copy ok';
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


2- ¿Solo se pueden obviar los () en estas construcciones: 3+3 if 4>3;?

3- ¿Cómo puedo escribir el carácter ~?

4- Estoy intentando leer un archivo de texto con comentarios. Quiero ignorar las líneas con # al principio. Mi código es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<FILE>) {
  2.         chomp;
  3.         if (! /^#/)  {
  4.                 print "$_" while <FILE>;
  5.                 }
  6.                
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y no me va.
Aunque también he probado con: /^#.*/

Por cierto, si alguien me pudiera aclarar qué hace el while <FILE> para el print(), mejor, es que no le veo el sentido, y los ().

5- Por lo que he visto el paso del _$ es automático en ciertas expresiones y contextos. Es un buen truco para ahorrar código, ¿hay más? ¿El _$ funciona independiente para cada bloque?
Última edición por gerkrt el 2010-11-25 08:43 @405, editado 1 vez en total
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Publicidad

Re: Varias dudas de novato

Notapor danimera » 2010-11-22 22:52 @994

1- Intenté hacer un script en Windows que me copiara un directorio con todos sus datos. Instalé y compilé correctamente la extensión del CPAN, sin embargo el código parece no funcionar...


Intenta con.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove);
  2.  
  3.   dircopy($orig,$new[,$buf]) or die $!;
  4.  
  5. my $file1='C:\Users\we\Documents\dosprog\';
  6. my $file2='C:\Users\we\';
  7.  dircopy($file1, $file2) or die "Copy failed: $!";
  8. print 'Copy ok';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


- ¿Solo se pueden obviar los () en estas construcciones 3+3 if 4>3;?


De hecho Perl tiene varias formas de hacer las cosas, hay varias formas del if
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "gato" if 4 > 3;  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


3- Como puedo escribir el carácter ~.


~ en mi PC lo saco con Alt+126, pero no sé si es a eso a lo que te refieres ^^

4- Estoy intentando leer un archivo de texto con comentarios. Quiero ignorar las líneas con # al principio. Mi código es:


Bueno, lo que veo es que el código tiene algo raro; yo utilizaría if (!/^\#/) creo que se debe poner siempre \ antes de caracteres especiales a buscar en la expresión regular y el código finalmente sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<FILE>) {
  2.         chomp;
  3.         if (! /^\#/)  {
  4.                 print "$_" while <FILE>;
  5.                 }
  6.                
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y no me va. Aunque también he probado con: /^#.*/


Prueba con (!/^\#/)
por cierto, si alguien me pudiera aclarar qué hace el while <FILE> para el print(), mejor, es que no le veo el sentido, ¿y los ()?


Explorer te explicará mejor qué hace el <FILE>, para mi es un handler para el fichero; digamos que este contiene al fichero para que pueda puedas manipular los datos.

5-Por lo que he visto el paso del _$ es automático en ciertas expresiones y contextos. Es un buen truco para ahorrar código, ¿hay más? ¿el _$ funciona independiente para cada bloque?


Cosas lindas de Perl; dirás $_, no _$; bueno, toma el valor de la última variable leída, es supramente especial ^^ . Explorer te dará mejor explicación.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Varias dudas de novato

Notapor explorer » 2010-11-23 07:21 @348

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
      while (<FILE>) {  # Mientras no lleguemos al final del fichero, leemos una línea

          next if /^#/;       # Saltar a la siguiente línea si la actual es un comentario

          print;              # Pintamos la línea
      }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El $_ no es independiente para cada bloque... bueno, quiero decir que en cada bloque while(), for(), map() y grep() estamos haciendo uso de él de forma local, por lo que no podremos tener un valor "global" de $_, salvo si usamos la forma

my $_; # nuevo en Perl v5.10
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Varias dudas de novato

Notapor gerkrt » 2010-11-23 16:20 @722

Gracias, lo de la expresión ya me va.

Mi otra duda era con la sentencia print while <FILE>; dentro de otro while(). ¿Qué efecto tiene ese sub-while()?

Con lo de los bloques es a lo que tu te refieres. Cada for(), etc. ¿son esas 4 funciones, solo?

~ en mi PC lo saco con Alt+126, pero no sé si es a eso a lo que te refieres ^^

Era eso, pero ¿cómo escribo esto del alt 126?


Por último, el recursive copy sigue fallando.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove);
  2. my $orig='F:\prova\\';
  3. my $new='C:\\Users\\we\\';
  4. my $buf=2000;
  5.   print (dircopy($orig,$new) or die $!);
  6.  
  7. my $file1='C:\\Users\\we\\Documents\\dosprog\\';
  8. my $file2='C:\\Users\\we\\';
  9.   print dircopy($file1, $file2) or die "Copy failed: $!";
  10. print 'Copy ok';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Este es el código que uso ahora. Mire que era el tercer argumento y vi que era un buffer, he probado con o sin él, con el da errores raros.

El print() del dircopy() además da a entender que sí copia archivos:

2311Copy ok

pd: no me funciona la ruta relativa

open FILE, 'H:\aprogramacion\programacioTOTAL\llistasele\config.ini' or die $!;

Si solo pongo el nombre del archivo no lo encuentra. ¿No funciona como en otros lenguajes?
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Re: Varias dudas de novato

Notapor explorer » 2010-11-23 17:37 @775

gerkrt escribiste:Mi otra duda era con la sentencia print while <FILE>; dentro de otro while(). ¿Qué efecto tiene ese sub-while()?
Pues igual que el primero: hacer un bucle por todo el fichero <FILE>, leyendo cada línea, y sacándola con el print(). En conjunto,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
      while (<FILE>) {
          chomp;
          if (! /^#/)  {
              print "$_" while <FILE>;
          }
      }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
hace lo siguiente: va leyendo línea a línea del fichero <FILE>, y le quita el carácter de fin de línea a cada una, y no hace nada más con ella. Si la línea que está tratando no comienza por '#', volcará en pantalla el resto del fichero, por el efecto del segundo bucle(). Y terminarán los dos bucles while() (los dos marcarán como falso por haber llegado al final del fichero).

gerkrt escribiste:Con lo de los bloques es a lo que tu te refieres. Cada for(), etc. ¿son esas 4 funciones, solo?
No, en buena parte de las funciones. Más información en perlsyn, perlfunc y perlop.

Era eso, pero ¿cómo escribo esto del alt 126?
Supongamos que tienes, delante de ti, un teclado típico de PC. En él, verás que hay una tecla llamada 'Alt'. Normalmente estará a la izquierda de la barra espaciadora. Bien, ahora mantenla pulsada. Luego vas, con la otra mano, a la parte del teclado donde está el teclado numérico, y pulsas '126'. Ya puedes soltar la tecla 'Alt'. Más información en la Wikipedia. Esto no funciona en todos los sistemas operativos. En mi Linux no funciona, por ejemplo.

Hay otra alternativa, que es lo que yo uso. Mantengo pulsada la tecla 'alt gr' (la que está a la derecha de la barra de espacio) y luego pulso el '4' del teclado normal. En Linux no habría que hacer más, pero en los Windows quizás haya que pulsar, adicionalmente, la barra de espacio.

Por último, el recursive copy sigue fallando.
En Perl, es más sencillo escribir las rutas de los ficheros.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use File::Copy::Recursive 'dircopy';
  2. my $orig = 'F:/prova/';
  3. my $new  = 'C:/Users/we/';
  4. my $n    = dircopy($orig,$new) or die "ERROR: $!\n";
  5. print "$n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Perl ya sabe que estás en Windows, así que se puede usar '/' en lugar de '\'.

El print() del dircopy() además da a entender que sí copia archivos:

2311Copy ok
Entonces, funciona.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Varias dudas de novato

Notapor gerkrt » 2010-11-24 21:16 @928

Todo solucionado, pues, excepto el recursive copy. Tras fijarme y testear, veo que sí copia los archivos, pero no el directorio...

¿O es que es así? ¿Lo copio con otra función?

¡Ah, sí!, se os ha pasado esto, creo:

pd: no me funciona la ruta relativa

open FILE, 'H:\aprogramacion\programacioTOTAL\llistasele\config.ini' or die $!;

Si solo pongo el nombre del archivo no lo encuentra. ¿No funciona como en otros lenguajes?
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Re: Varias dudas de novato

Notapor explorer » 2010-11-25 05:50 @285

De vez en cuando, no estaría demás leerse el manual, aunque sea un poquito.

En la sección Emulating cp -rf dir1/ dir2/ explica las dos formas de funcionamiento de dircopy().

(no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use File::Copy::Recursive 'dircopy';
  2. my $orig = 'F:/prova';
  3. my $new  = 'C:/Users/we';
  4.  
  5. mkdir $new; # Primero hay que asegurarse que el directorio destino existe
  6.  
  7. $File::Copy::Recursive::CPRFComp = 1;   # activamos compatibilidad con cp -rf
  8.  
  9. my $n = dircopy($orig,$new) or die "ERROR: $!\n";
  10. print "$n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora ya mete el directorio 'prova' dentro de 'we', junto con todos los contenidos de 'prova'.

En cuanto a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open FILE, 'H:\aprogramacion\programacioTOTAL\llistasele\config.ini' or die $!;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sí que se puede indicar solamente el nombre del fichero, siempre y cuando el programa se esté ejecutando en el mismo directorio de trabajo que el fichero. Si no es el mismo directorio, habrá que indicar la ruta completa, como se indica ahí, o entrar en el directorio con un chdir().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Varias dudas de novato

Notapor gerkrt » 2010-11-25 08:42 @404

Me lo leí, y también el del dircopy(). Aunque esto se me había escapado.

Pues ya está claro. Al ser interpretado el binario que lo ejecuta está en otra carpeta, mientras que si es compilado se llama a sí mismo...

Pero bueno, esto ya me lo miraré yo. Pasa que va bien que te desatasquen un poco al principio, gracias.
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Re: [RESUELTO]Varias dudas de novato

Notapor explorer » 2010-11-25 12:13 @551

Perdona, pero yo no veo nada que esté compilado... ni nada que esté interpretado :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [RESUELTO]Varias dudas de novato

Notapor gerkrt » 2010-11-25 15:09 @673

A lo que me refiero es a que si compilo un programa en C y lo ejecuto, si la ruta es relativa a la carpeta donde está el ejecutable, entonces tiene sentido.

En cambio, si interpreto un Perl la ruta relativa es donde esté el ejecutable de Perl y no el archivo de texto, ¿cierto?
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron