problema con switch en perl

Iniciado por Drewermerc, 15 Junio 2014, 21:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Drewermerc

Hola a todo.

Bueno apenas estoy aprendiendo perl y el problema que tengo es que en este programa no me funciona switch quisiera ver si me podrian ayudar para saber cual es el problema.

Tambien quería comentarles  esta duda es como comparar caracteres en until ya que intente de varias formas pero me dice que hay un error con una ociones que intente y cuando uso  $opcion eq "s"  si corrre bien el programa pero nunca se cumple la condicion.

Código (perl) [Seleccionar]

#!/usr/bin/perl
use Switch;
use warnings;
use strict;

sub operaciones;


my $numuno = 0;
my $numdos = 0;
printf "Introduce los dos numero para realizar las operaciones\n";
$numuno = <stdin>;
$numdos  = <stdin>;
operaciones();

sub operaciones
{
my $suma = 0;
my $resta = 0;
my $multiplicacion = 0;
my $divicion = 0;
my $operacion = 0;
my $opcion = 0;
do
{
print "Que operacion quieres hacer primero\n";
print "1.suma\n";
print "2.resta\n";
print "3.multiplicacion\n";
print "4.divicion\n";
print "5.salir\n";
$operacion = <stdin>;
switch($operacion)
{
case 1
{
$suma = $numuno + $numdos;
print "El resultad de la suma es: $suma\n";
}
case 2
{
$resta = $numuno - $numdos;
print "El resultad de la suma es: $resta\n";
}
case 3
{
$multiplicacion = $numuno * $numdos;
print "El resultad de la suma es: $multiplicacion\n";
}
case 4
{
$divicion = $numuno / $numdos;
print "El resultad de la suma es: $divicion\n";
}
else
{
print "Opcion no valida\n";
print  "Quieres elegir otra opciono quieres salir\n";
$opcion = <stdin>;
}

}


}until( $opcion eq "s");
#until( $opcion == 's');
#until( $opcion == "s");
#until( $opcion != "s");

}



Tambien intente hacer el codigo de esta forma pero me da mucho errores y la unica forma de solucionarlos es poner cada vez que uso las variabes tengo que declararlas como locales poniendo my, quisiera que me dijeran cual es el metodo que debo usar ya que en varios ejemplos que e visto usan este segundo metodo de declarar primero la subrutina

Código (perl) [Seleccionar]

#!/usr/bin/perl
use Switch;
use warnings;
use strict;

sub operaciones
{
my $suma = 0;
my $resta = 0;
my $multiplicacion = 0;
my $divicion = 0;
my $operacion = 0;
my $opcion = 0;
do
{
print "Que operacion quieres hacer primero\n";
print "1.suma\n";
print "2.resta\n";
print "3.multiplicacion\n";
print "4.divicion\n";
print "5.salir\n";
$operacion = <stdin>;
switch($operacion)
{
case 1
{
$suma = $numuno + $numdos;
print "El resultad de la suma es: $suma\n";
}
case 2
{
$resta = $numuno - $numdos;
print "El resultad de la suma es: $resta\n";
}
case 3
{
$multiplicacion = $numuno * $numdos;
print "El resultad de la suma es: $multiplicacion\n";
}
case 4
{
$divicion = $numuno / $numdos;
print "El resultad de la suma es: $divicion\n";
}
else
{
print "Opcion no valida\n";
print  "Quieres elegir otra opciono quieres salir\n";
$opcion = <stdin>;
}

}


}until( $opcion eq "s");
#until( $opcion == 's');
#until( $opcion == "s");
#until( $opcion != "s");

}

my $numuno = 0;
my $numdos = 0;
printf "Introduce los dos numero para realizar las operaciones\n";
$numuno = <stdin>;
$numdos  = <stdin>;
operaciones();



Bueno espero que me puedan ayudar.
Saludos.
Drewermerc.

daryo

porque
Código (perl) [Seleccionar]
$operacion = <stdin>;
devuelve una cadena puedes o cenvertir los case en cadenas o convertir operacion a entero:
cambia
Código (perl) [Seleccionar]
switch($operacion)
por
Código (perl) [Seleccionar]
switch(int($operacion))
buenas

explorer

Ya que estás aprendiendo Perl, te recomiendo que no uses el módulo Switch.

Siempre ha tenido errores. En estos momentos, marca que sólo tiene 4 errores denunciados, pero seguro que tiene más.

Fíjate lo que dice en su descripción:

Switch - A switch statement for Perl, do not use if you can use given/when

"No lo uses si puedes usar given/when".

given/when forma parte de los nuevos intérpretes de Perl, desde la versión v5.10. Para hacer uso de él (si tienes un Perl moderno), te vale con poner al principio del programa

use v5.10;

o también

use feature 'switch';

(Tienes más información sobre esto en perldoc perlsyn. Busca por la sección Switch statements)


La comparación de caracteres, efectivamente se hace con 'eq', pero... no te funciona porque en la línea 59, al leer desde el teclado, estás incluyendo el carácter de nueva línea (cuando el usuario pulsa la tecla de Entrar o Retorno).

Antes de hacer la comparación, debes asegurarte de que has eliminado esos caracteres, y sólo te quedas con la opción que el usuario ha elegido. Para ello, usa la función chomp(). Quedaría así:

Código (perl) [Seleccionar]
$opcion = <stdin>;
                                 chomp $opcion; # quitar caracteres de nueva línea



Drewermerc

Hola amigos.
Gracias a los dos esos era los problemas que tenia ahora ya funciona bien el programa  y explorer no se que error te refieres ya que a mi no me arroja ese error y bueno investigare sobre esa funciones y bueno pues tengo la version 5.18 que si podre probar las funciones que me mencionaste.

Saludos.
Drewermerc.