• Publicidad

Errores en la ejecución

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

Errores en la ejecución

Notapor ignasificus » 2006-06-05 05:59 @291

Saludos,
El tema es el siguiente, estoy acabando un curso de introducción al Linux, y uno de los ejercicios finales, es un programa en Perl. Bien, pues el caso es que lo tengo "terminado", a mi manera, pero está hecho, vamos, que no es ninguna maravilla y hay algunas cosas que seguramente se podrían hacer de manera más sencilla, pero estoy iniciandome en esto, y no he podido hacer nada mejor. XD

Bueno, el tema es que yo creo que está todo bien, sin embargo al ejecutarlo en modo debug, me salen unos "errores" o avisos, y el programa no hace nada.

son estos:
Código: Seleccionar todo
C:\Documents and Settings\Ignasificus\Practicas_PERL>perl -w info_passwd.pl
Useless use of push with no values at info_passwd.pl line 22.
Name "main::dirname" used only once: possible typo at info_passwd.pl line 48.
Use of uninitialized value in open at info_passwd.pl line 42.
Argument "!" isn't numeric in numeric eq (==) at info_passwd.pl line 66.
Argument "*" isn't numeric in numeric eq (==) at info_passwd.pl line 66.


Bueno, aquí está desde Windows, pero en Linux me tira más o menos los mismos errores, el caso es que funcione en Linux (ya que se trata de sacar información del archivo \etc\passwd).

Donde pone "useless use of push with no values", en la linea 22 del código fuente, hay lo siguiente: $longitud = push(@entradas); que está puesto para que devuelva en la variable $longitud, el número de líneas del fichero passwd, que está abierto en @entradas.

No veo prudente poner el código aquí, ya que el curso está en marcha, y este es uno de los últimos ejercicios. Pero, también sé que es casi imposible determinar el error sin tener el código presente, de manera que quien pueda ayudarme a solucionar el problema, le puedo mandar el código por e-mail o algo, y lo hablamos.

¡Desde ya, muchas gracias!
Avatar de Usuario
ignasificus
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-06-01 07:07 @338
Ubicación: Valencia

Publicidad

Notapor explorer » 2006-06-05 06:36 @316

Useless use of push with no values at info_passwd.pl line 22.
Es posible que falte un argumento a la función push, como así, ocurre. Cambia la línea por
Código: Seleccionar todo
$longitud = @entradas;


Name "main::dirname" used only once: possible typo at info_passwd.pl line 48.
En esa línea estás usando $dirname y ninguna vez en el resto del programa. ¿Has comprobado que realmente esa es la variable que quieres usar?.

Use of uninitialized value in open at info_passwd.pl line 42.
Estás operando con una variable que no ha sido inicializada (estás haciendo cuentas con una variable que no ha recibido ningún valor todavía).

Argument "!" isn't numeric in numeric eq (==) at info_passwd.pl line 66.
Argument "*" isn't numeric in numeric eq (==) at info_passwd.pl line 66.

Estás haciendo comparaciones de cadena de caracteres con el operador "==", que sólo vale para expresiones matemáticas. Si quieres comparar cadenas de caracteres (y también vale para valores numéricos), usa 'eq'.

Consejo: al principio del programa, pon estas líneas:
Código: Seleccionar todo
use warnings;
use diagnostics;
Perl te avisará de todos los posibles fallos que encuentre. Si, además, agregas
Código: Seleccionar todo
use strict;
Perl te obligará a programar de forma mucho más cuidadosa, lo cual, a veces, viene muy bien. Otras... no tanto...
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

gracias

Notapor ignasificus » 2006-06-05 07:16 @344

Gracias por tu ayuda, lo de "eq" no lo sabía :x
Ahora ya solo me tira dos errores.. :?
Uno en la linea 22,

Código: Seleccionar todo
 $longitud = push(@entradas); # <<-- linea 22


Que no se porqué, ya que lo unico que quiero ahi, es que me devuelva lalongitud del vector, vamos, el length.

Y el otro, en la linea 42, que es la que sigue,


Código: Seleccionar todo
$indice = 0;

while ($indice < $longitud)
{
   $nombrevector = "entrada" . $indice;
   $n_tam = "tam" . $indice;
   
   open DIR, ${$nombrevector}[5];  #<<-- linea 42
   @files = readdir DIR;
   closedir DIR;


Tampoco comprendo que sucede aqui, porqué no funciona. Lo demás creo que está bien.
Avatar de Usuario
ignasificus
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-06-01 07:07 @338
Ubicación: Valencia

Notapor monoswim » 2006-06-05 12:20 @555

$longitud = push(@entradas);

eso no te da la longitud, lo haces con

$longitud = @entradas;

El push es para agregar un elemento al array...

y la 42 la sentencea para abrir un dorectorio es opendir, no open DIR porque open es para archivos...

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor ignasificus » 2006-06-06 03:50 @202

Gracias por las respuestas,
Voy a coger el codigo, y voy a tratar de sintetizarlo en algo mas pequeño o comprensible, ya que hasta a mi me cuesta comprender lo que he exo.. ya casi no da errores (tan solo uno), pero no me convenze, tiene que ser mas sencillo.
Avatar de Usuario
ignasificus
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-06-01 07:07 @338
Ubicación: Valencia

Me funciona!

Notapor ignasificus » 2006-06-06 18:10 @799

Bua! que tonteria mas grande!
Despues de fijarme en el codigo, de repasarlo varias veces, acabé cogiendole cariño, lo dividi en cinco partes, cada parte hacia una cosa, y fui comentando estas partes, hasta que di con una que parecia ser la causante de todo mal.. y exactamente era esa, pero por una gilipoyez, le faltaba esta linea:
Código: Seleccionar todo
$indice ++;

Después de esto, al ejecutar el programa ya no se ha detenido donde solia quedarse "congelado", y es que al no existir esta linea, entraba en un bucle infinito. Pero ya está!

Lo he terminado y funciona de maravilla, ahora ya me siento feliz de haber terminado mi primer script en perl. XD!!

y gracias a este foro, que pude resolver con vosotros dos dudas, y me despejasteis algunos que otros errores.
Avatar de Usuario
ignasificus
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-06-01 07:07 @338
Ubicación: Valencia

Notapor monoswim » 2006-06-06 21:46 @949

que bueno que lo hayas solucionado y que hayas podido terminar tu primer script...BIENVENIDO A PERL !!!

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 20 invitados