• Publicidad

Impresión repetida

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

Impresión repetida

Notapor Sombrerero_Loco » 2008-11-12 11:07 @505

¡Hola de nuevo!

Tengo otro pedazito de código (se nota que estoy practicando a diario)
Os pego el código y lo que me devuelve:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

print "Introduce el radio para poder calcularte la circunferencia\n";
chomp (my @radio = <STDIN>);
my $pi = "3.141516";
@malos = "";
@buenos = "";

foreach $radio(sort @radio)
        {
        if ($radio < 0)
                {
                push @malos,$radio;


                }
        else
                {
                push @buenos,$radio;
                }
        }

foreach $buenos(sort @buenos)       {
         my $circunferencia = $buenos * 2 * $pi;
         print "Estos son las circunferencias buenas: $circunferencia\n";
         }
if (@malos == ""){
   print "La verdad que no la has cagado con ningun numero\n";
                    }
else                {

print "estos son los valores que no me valen: @malos\n";
      }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



y me devuelve:
Código: Seleccionar todo
niko@Beelzebub:~$ sudo ./primerperl.pl
Introduce el radio para poder calcularte la circunferencia
10
12
-5
0
Estos son las circunferencias buenas: 0
Estos son las circunferencias buenas: 0
Estos son las circunferencias buenas: 62.83032
Estos son las circunferencias buenas: 75.396384
estos son los valores que no me valen:  -5


Como veis sí que me detecta que el valor -5 es menor a 0 y por eso lo coloca en el array @malos, pero no entiendo por qué me pinta cuatro veces los valores que están en el array @buenos, ya que solo deberían estar los valores mayores de 0, y de los que he escrito, solo 2 son mayores de 0... ¿o quizás 0 también lo metería? pero aun siendo así, no me tendría que aparecer la cuarta vez...

¡Todo un misterio!

¡Gracias a todos por vuestra ayuda!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Publicidad

Notapor Sombrerero_Loco » 2008-11-12 11:13 @509

Ademas, me acabo de dar cuenta ahora, que debo de poner que sea <= 0, con lo que me coje 0 como valor malo también.

Pero, si no introduzco ningún valor nulo, no me hace el else del ultimo if y me dice lo de que no la he cagado con lo que no sé, si declarando if (@malos =="") estoy diciéndole que si cumple la condición de que el array está vacío, haga lo que viene después.

He intentado hacer algo como if (defined (@malos)); y me da error de sintaxis, así que tampoco sé.

¡Gracias de nuevo!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor explorer » 2008-11-12 11:34 @523

Recuerda que puedes reeditar tus propios mensajes, pulsando el botón de editar, que está a la derecha.

En cuanto a la comparación, no puedes comparar un array con una cadena de caracteres usando un operador de comparación numérico (¡vaya lío has armado!).

Un array, en contexto escalar, nos devuelve el número de elementos que contiene. Sabiendo eso, se puede escribir como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (@malos == 0) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
que, por otra parte, se puede simplificar en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (!@malos) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
O así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (@malos) {
    print "estos son los valores que no me valen: @malos\n";
}
else {
    print "La verdad que no la has cagado con ningun numero\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Me sigue funcionando mal...

Notapor Sombrerero_Loco » 2008-11-13 05:11 @258

Hola.

¡Gracias!, pero me sigue funcionando mal, pongo lo que me indicas ya que tenía un guirigay horrible y me sigue pasando que me saca primero un 0 y luego los valores que son correctos correctamente pasados por $circunferencia.

Y además no me hace lo de la primera parte del if, me salta al else aunque no haya puestos valores malos.

Curioso, ¿verdad?
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor explorer » 2008-11-13 06:59 @332

El problema está en la inicialización de los array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@malos = "";
@buenos = "";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Parece que les estás inicializando a vacío (ningún elemento), pero en realidad estás guardando un elemento en cada uno de ellos: una string vacío.

Lo siguiente lo demuestra: pintamos el número de elementos que tiene un array inicializado de esa manera:
Código: Seleccionar todo
explorer@joaquin:~> perl -le '@x = ""; print scalar @x'
1
Así que @x tiene un elemento: una cadena vacía.

La forma de inicializar los array es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @buenos; # si lo hacemos al principio del programa
my @malos;

@buenos = ();   # si lo hacemos repetidamente en medio del programa
@malos  = ();

undef @buenos;  # otra manera
undef @malos;

reset 'b','m';  # algo realmente obscuro
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Esa es la razón por la que @buenos siempre tiene un valor 0 al principio: la cadena vacía se convierte en un 0 al pasar por la operación matemática del cálculo de la circunferencia (Perl convierte la cadena de caracteres en un número).
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

Notapor Sombrerero_Loco » 2008-11-13 07:05 @337

¡Gracias!

Intuía que sería algo de ese estilo, pero pensé que al darle "" le decía que cogiera undef, y entendía que undef era igual a 0, pero por lo que me dices al hacerlo así le digo que el string está vacío, pero hay string.

Oído cocina.

¡Gracias!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor explorer » 2008-11-13 07:22 @348

Hummm....

Pretendías decirle que el número de elementos de los array era 0...

Eso se puede expresar de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$#malos = $#buenos = -1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(demasiado obscuro)

o así
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@malos = @buenos = ();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Me quedo con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my (@malos, @buenos);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
ya que así los defino educadamente y los inicializo correctamente.

Naturalmente, tu puedes escoger la que quieras :wink:
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

Notapor Sombrerero_Loco » 2008-11-13 10:10 @465

Cuando quieres decir "obscuro", te refieres a :
¿"Método de programación extremadamente punky?"

:D
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514


Volver a Básico

¿Quién está conectado?

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

cron