• Publicidad

Traducir código Ruby

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

Traducir código Ruby

Notapor BigBear » 2012-09-24 17:50 @785

Tengo el siguiente código en Ruby
Sintáxis: [ Descargar ] [ Ocultar ]
Using ruby Syntax Highlighting
  1. logo=[
  2. "testando",
  3. "esto",
  4. "ahora"
  5. ]
  6.  
  7. def mostrar text
  8.   w="|"
  9.   text.each do |str|
  10.     str.scan(/./) do |c|
  11.         STDOUT.flush
  12.       if w=="|"
  13.         print "\b"+c +w
  14.         w="/"
  15.       elsif w=="/"
  16.         print "\b"+c +w
  17.         w="-"  
  18.       elsif w=="-"
  19.         print "\b"+c +w
  20.         w="\\"
  21.       else
  22.       print "\b"+c +w
  23.       w="|"
  24.       end
  25.       sleep 0.04
  26.     end
  27.     print "\b "
  28.     puts ""
  29.   end
  30. end
  31.  
  32. mostrar(logo)
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Mi pregunta es si alguien me podría ayudar a traducirlo a Perl porque lo he intentado pero nunca logro el mismo resultado.

¿ Alguien me podría ayudar ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Traducir código Ruby

Notapor explorer » 2012-09-24 19:08 @839

Sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use IO::File;
  4. use Time::HiRes 'usleep';
  5.  
  6. my @logo = qw( testando esto ahora );   #    logo=[
  7.                                         #    "testando",
  8.                                         #    "esto",
  9.                                         #    "ahora"
  10.                                         #    ]
  11.                                         #
  12. sub mostrar {                           #    def mostrar text
  13.     my @text = @_;                      
  14.     my $w    = '|';                     #    w="|"
  15.                                        
  16.     for my $str (@text) {               #    text.each do |str|
  17.         for my $c (split //, $str) {    #       str.scan(/./) do |c|
  18.             STDOUT->flush;              #       STDOUT.flush
  19.             if ($w eq '|') {            #       if w=="|"
  20.                 print "\b$c$w";         #           print "\b"+c +w
  21.                 $w = '/';               #           w="/"
  22.             }
  23.             elsif ($w eq '/') {         #       elsif w=="/"
  24.                 print "\b$c$w";         #           print "\b"+c +w
  25.                 $w = '-';               #           w="-"  
  26.             }
  27.             elsif ($w eq '-') {         #       elsif w=="-"
  28.                 print "\b$c$w";         #           print "\b"+c +w
  29.                 $w = '\\';              #           w="\\"
  30.             }
  31.             else {                      #       else
  32.                 print "\b$c$w";         #       print "\b"+c +w
  33.                 $w = '|';               #       w="|"
  34.             }                           #       end
  35.             usleep(40_000);             #       sleep 0.04
  36.         }                               #       end
  37.         print "\b ";                    #       print "\b "
  38.         say;                            #       puts ""
  39.     }                                   #    end
  40. }                                       #    end
  41.                                         #
  42. mostrar(@logo);                         #    mostrar(logo)
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

pero se puede reducir bastante... hay código repetido...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use Time::HiRes 'usleep';
  4.  
  5. $|++;  # autoflush STDOUT
  6.  
  7. my @w = ('|', '/', '-', '\\');
  8.  
  9. my @logo = qw( testando esto ahora );
  10.  
  11. sub mostrar {
  12.     my $i = 0;
  13.  
  14.     for my $str (@_) {
  15.         for my $c (split //, $str) {
  16.             print "\b$c" . $w[($i++) % 4];
  17.             usleep(40_000);
  18.         }
  19.         say "\b ";
  20.     }
  21. }
  22.  
  23. mostrar(@logo);
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Traducir código Ruby

Notapor BigBear » 2012-09-27 19:56 @872

perfecto, explorer, pero te quería preguntar qué otras alternativas tengo para la parte de los if() del segundo código que publicaste en la línea 16.

¿ Me podrías dar algunos ejemplos ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Traducir código Ruby

Notapor explorer » 2012-09-27 20:51 @910

En el segundo código, en la línea 16, no hay ningún if()... es solo una operación matemática.
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: Traducir código Ruby

Notapor BigBear » 2012-09-29 12:01 @542

Entonces me expresé mal. Quería preguntarte qué otra forma habría de hacer los if() de una forma reducida pero sin usar la operación matemática.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Traducir código Ruby

Notapor explorer » 2012-09-29 16:48 @742

Lo único que se me ocurre es reducir los print() que sacan los caracteres individuales, a uno solo, justo antes de los if(). Pero nada más, y solo ahorrarías tres líneas.

Otra forma sería usa given/when pero no reducirías el número de líneas. Solo simplificarías la notación.

Otra forma sería usando un for() junto con modificadores when (no probado, necesita Perl >= v5.10):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "\b$c$w";
  2. for ($w) {
  3.     when ('|') { $w = '/'  }
  4.     when ('/') { $w = '-'  }
  5.     when ('-') { $w = '\\' }
  6.     when ('\\'){ $w = '|'  }
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La solución matemática es más elegante, y reduce el código en veinte líneas.

En perlsyn tienes ejemplos de cómo construir un switch/case de varias formas distintas, precisamente para demostrar que Perl no necesita de un switch/case ;)
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: Traducir código Ruby

Notapor BigBear » 2012-09-29 18:08 @797

Ya casi termino mi versión de la función que estoy haciendo a mi manera pero cuando quise sacar unsleep por el sleep el script no hace el efecto marquesina y se muestra todo de una vez, ¿me podrías explicar por qué pasa eso y cómo podría reemplazar unsleep por sleep?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Traducir código Ruby

Notapor explorer » 2012-09-29 18:42 @821

No entiendo a qué te refieres con unsleep.

El sleep del Perl solo entiende de valores enteros, para saber cuántos segundos debe esperar.
Así que si le pones

sleep 0.04;

en lugar de esperar 4 centésimas de segundo, no esperará nada (0 segundos). Más información en perldoc -f sleep.

Por eso usamos usleep(), del módulo Time::HiRes, para poder hacer esperas con un granularidad inferior a un segundo.
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: Traducir código Ruby

Notapor BigBear » 2012-09-29 18:47 @824

Bueno , entonces el código me quedó así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use Time::HiRes "usleep";
  4.  
  5. my @test = ("testando ahora now");
  6.  
  7. sub marquesina {
  8.  
  9. my @logo = @_;
  10.  
  11. my $car = "|";
  12.  
  13. for my $uno(@logo) {
  14. for my $dos(split //,$uno) {
  15.  
  16. $|++;
  17.  
  18. if($car eq "|") {
  19. mostrar("\b".$dos.$car,"/");
  20. }
  21. elsif($car eq "/") {
  22. mostrar("\b".$dos.$car,"-");
  23. }
  24. elsif($car eq "-") {
  25. mostrar("\b".$dos.$car,"\\");
  26. } else {
  27. mostrar("\b".$dos.$car,"|");
  28. }
  29. usleep(40_000);  
  30. }
  31. print "\b ";
  32. }
  33.  
  34. sub mostrar {
  35. print $_[0];
  36. $car = $_[1];
  37. }
  38.  
  39. }
  40.  
  41. marquesina(@test);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Espero que no sea mucho pedir, pero encontré otro código en Ruby que necesitaría que me ayudes a traducirlo como el primero (si es que quieres).

El código está acá http://pastebin.com/kCMZq9Uz
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Traducir código Ruby

Notapor explorer » 2012-09-29 19:34 @857

Doddy escribiste:Espero que no sea mucho pedir, pero encontré otro código en Ruby que necesitaría que me ayudes a traducirlo como el primero (si es que quieres)
Yo no sé Ruby. Además, si el código original funciona, ¿para qué pasarlo a Perl?

Hay proyectos interesantes que se pasan de Ruby a Perl, como el protocolo Plack/PSGI, pero para programas pequeños... solo lo veo interesante si es para aprender Ruby y/o Perl.

Como a mi no me interesa aprender Ruby, te dejo la tarea a ti :)
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado