• Publicidad

Encuesta en Perl (Optimización)

Perl aplicado a la bioinformática

Encuesta en Perl (Optimización)

Notapor perlaperlita » 2013-05-15 06:35 @316

Querría saber el código óptimo para realizar una encuesta en Perl. La tenemos realizada, pero nos parecen demasiadas líneas y queríamos ver la manera más óptima. La encuesta consiste en una batería de preguntas a las que se responderá sí y no mediante [Y] y [N], y dependiendo de si la respuesta sea positiva o negativa se pasará a una siguiente pregunta que dependerá de la primera. Así, si a una pregunta que se interesa por el conocimiento del usuario sobre algo se responde negativamente, el programa mostrará una breve explicación y continuará con una pregunta relacionada para conocer más acerca de lo que la persona sabe.

Realmente lo único que necesitaríamos sería la estructura básica y óptima para las distintas condiciones encadenadas, que en el organigrama toman forma de ramificaciones, como un árbol genealógico.

Partiendo de una pregunta, aparecen otras 2, de esas otras 4 para seguir con 8 y que finalmente sean 16.

Gracias de antemano.
perlaperlita
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-05-15 06:28 @311

Publicidad

Re: Encuesta en Perl (Optimización)

Notapor explorer » 2013-05-15 07:00 @333

Bienvenida a los foros de Perl en Español, perlaperlita.

Yo creo que usando Term::Menu::Hierarchical lo tenéis resuelto. Es cuestión de que hagáis una prueba.

Naturalmente, es un módulo para usar en terminal. No has dicho nada de dónde se tienes que ver esa encuesta, pero he supuesto que es para una terminal.

La estructura jerárquica se hace en una construcción de hash de hashes, se llama a menu(), y el programa va sacando todos los menús según lo que vaya eligiendo el usuario. Y al final, devuelve la elección última que haya escogido el usuario.

Lo malo es que dices que tiene que salir una explicación en mitad de algunos menús.

Podéis mirar el funcionamiento del módulo (su código fuente) para ver cómo trata la estructura jerárquica, copiarlo en vuestro programa, y personalizarlo con los textos que deben salir en ciertos momentos (que podrían estar almacenados en otro hash y saldrían si la clave coincide con alguna de las respuestas o preguntas del usuario o el estado o nivel en que se encuentra).
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: Encuesta en Perl (Optimización)

Notapor perlaperlita » 2013-05-15 07:33 @356

Realmente ha habido un error, porque no quería exponer este tema en el apartado del Mundo Perl < Intermedio, si no en Bioinformática, ya que es más relacionado con ese ámbito y además estaría dentro de algo más Básico, y tampoco he explicado demasiadas cosas así que pido perdón y me dispongo a ello:

Es una encuesta que hemos realizado con diferentes "if" que iban llevando a otros y así sucesivamente. Dentro de dichas condiciones, y cuando igualábamos la condición a las variables que definen respuesta negativa o positiva, poníamos el "print" que correspondiese y continuábamos con el programa. El problema está en que son demasiadas líneas de código, y además es ese conjunto de condiciones para cuatro temas distintos (es decir, x4). El programa va almacenando las respuestas en un array para terminar pasándolos a un archivo externo en .txt. A partir de ese archivo, una vez creado con las respuestas de todas las personas que someteríamos a la encuesta, comenzaríamos otro en el que contabilizaríamos las respuestas positivas y negativas y mostraríamos diferentes datos estadísticos y demás contenidos que no vienen al cuento.

Está destinado a ser mostrado en proyector a partir de un ordenador personal, el cual tiene instalado Perl y sería ejecutado a través del 'cmd'.

Un saludo y mil gracias de nuevo.
perlaperlita
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-05-15 06:28 @311

Re: Encuesta en Perl (Optimización)

Notapor explorer » 2013-05-15 14:27 @644

Se puede hacer una parte de un programa que fuera recorriendo la estructura jerárquica de preguntas, hasta llegar a las últimas (que supongo que es lo único que quieres guardar), parecido a como lo hace el módulo enlazada antes. El tema son las excepciones a las reglas, que son los textos que quieres sacar según las respuestas negativas que el usuario elija.

Esta es una posible solución (mínima):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.16;
  3. use utf8::all;                  # Turn on UTF-8. All of it.
  4.  
  5. my %preguntas = (
  6.     pregunta    => "¿Es mujer?",
  7.     y => {  
  8.             pregunta    => "¿Se ha realizado alguna prueba de presencia de tóxicos?",
  9.             y           => {
  10.                             pregunta    => "¿La prueba dio positivo?",
  11.                             y           => "M+",
  12.                             n           => "M-",
  13.                         },
  14.             n           => {
  15.                             pregunta    => "Ha de saber que se le realizará una prueba de tóxicos.\n\n¿Está de acuerdo?",
  16.                             y           => "MY",
  17.                             n           => "MN",
  18.                         },
  19.         },
  20.     n => {
  21.            pregunta     => "¿Ha realizado algún viaje en barco?",
  22.            y            => {
  23.                             pregunta    => "¿Sufrió alguna infección?",
  24.                             y           => "HBY",
  25.                             n           => "HBN",
  26.                         },
  27.            n            => {
  28.                             pregunta    => "¿Está vacunado?",
  29.                             y           => "HVY",
  30.                             n           => "HVN",
  31.                         },
  32.         },
  33. );
  34.  
  35. sub preguntar {
  36.     my $ref = shift;
  37.  
  38.     if (ref($ref) eq "HASH") {                             # si es una ref. a un hash
  39.         my $respuesta;                                     # iniciamos una nueva pregunta
  40.         while ($respuesta ne 'y' and $respuesta ne 'n') {  # no salimos hasta que no sea un 'y' o 'n'
  41.             print "Pregunta: $ref->{pregunta} [y/n]: ";    # sacamos la pregunta
  42.             $respuesta = lc(readline);                     # leemos respuesta y la pasamos a minúsculas
  43.             chomp $respuesta;                              # quitamos carácter fin de línea
  44.         }
  45.         preguntar( $ref->{$respuesta} );                   # saltamos a la siguiente pregunta, según la $respuesta
  46.     }
  47.     else {                                                 # Si no es una pregunta,
  48.         say $ref;                                          # es el resultado final, así que lo sacamos
  49.     }
  50. }
  51.  
  52. preguntar(\%preguntas);                                    # Hacemos la primera pregunta
  53.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> ./kk.pl
Pregunta: ¿Es mujer? [y/n]: y
Pregunta: ¿Se ha realizado alguna prueba de presencia de tóxicos? [y/n]: y
Pregunta: ¿La prueba dió positivo? [y/n]: y
M+
> ./kk.pl
Pregunta: ¿Es mujer? [y/n]: n
Pregunta: ¿Ha realizado algún viaje en barco? [y/n]: y
Pregunta: ¿Sufrió alguna infección? [y/n]: n
HBN
> ./kk.pl
Pregunta: ¿Es mujer? [y/n]: y
Pregunta: ¿Se ha realizado alguna prueba de presencia de tóxicos? [y/n]: n
Pregunta: Ha de saber que se le realizará una prueba de tóxicos.

¿Está de acuerdo? [y/n]: y
MY
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En este caso, la resolución del problema se hace por medio de una llamada recursiva mientras haya preguntas que hacer, o hasta que tengamos un resultado de la encuesta. Aquí saco el resulatado en pantalla, pero lo normal es guardarlo en algún otro sitio.
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: Encuesta en Perl (Optimización)

Notapor perlaperlita » 2013-05-15 15:12 @675

Jolín, esperaba una respuesta pero no tan amplia. He estado mirando por ahí y he visto que le pone el mismo empeño (muchísimo) a cada uno de los mensajes que se publican.

Muchísimas gracias por la respuesta y probaremos en breves la opción que nos planteas.
perlaperlita
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-05-15 06:28 @311


Volver a Bioinformática

¿Quién está conectado?

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