• Publicidad

Sentencia for()

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

Sentencia for()

Notapor erv-Z » 2009-11-20 18:38 @818

Buenas, he estado codeando una función para incrementar números, pero tengo un problema, y es que cuando ejecuto el script se queda en 1...
mi script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $d = "numero=";
$d .= a();
print "$d\n";

sub a {
    for ($f=1;$f<=10;$f++) {
        $x .= $f.",";
        my $a;
        $a .= $x;
        $a =~ s/,$//;
        my $y .= $a;
        return "$y\n";
    }
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Quiero que su salida sea así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
numero=1
numero=1,2
numero=1,2,3
numero=1,2,3,4
numero=1,2,3,4,5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

etc... hasta llegar a 10.

Saludos.
Última edición por explorer el 2009-11-21 05:36 @275, editado 1 vez en total
Razón: Ortografía, bloques de código
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Publicidad

Re: Sentencia for()

Notapor charlygarcia » 2009-11-21 06:42 @321

Si lo que quieres es

Sintáxis: [ Descargar ] [ Ocultar ]
  1. numero=1 
  2. numero=1,2 
  3. numero=1,2,3 
  4. numero=1,2,3,4 
  5. numero=1,2,3,4,5 


lo más sencillo creo que sería:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $d="numero=";
for ($f=1;$f<=10;$f++)
{
   $d.=$f;
   if($f>1)
   {
      $d.=",";  #solo con uno no hay coma el resto lleva comas
   }
   print("$d \n");
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-11-21 06:46 @323, editado 1 vez en total
Razón: Tildes
[text]¿Cómo lograr que no se seque una gota de agua? Arrojándola al mar. [/text] - Nota: Este tag no se puede utilizar en firmas.Samsara
Avatar de Usuario
charlygarcia
Perlero nuevo
Perlero nuevo
 
Mensajes: 54
Registrado: 2009-03-06 23:16 @011

Re: Sentencia for()

Notapor explorer » 2009-11-21 06:45 @323

for() y foreach() NO son funciones. Son sentencias de control , que en Perl siguen casi las mismas directrices que en otros lenguajes.

Simplificando tu código a lo que realmente hace, queda
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $d = "numero=" . a();
print "$d\n";

sub a {
    for ( $f = 1; $f <= 10; $f++ ) {    # Hacemos un bucle de 1 a 10
        $x .= "$f,";                    # Actualizamos el contenido de $x
        my $a = $x;
        $a =~ s/,$//;                   # $a es igual a $x, pero sin la coma final
        return "$a\n";                  # Es $a lo que devolvemos
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Hay una serie de errores...
  1. Quieres sacar la frase "numero=..." varias veces, pero has trasladado el bucle a la generación de lo que sigue. Pero no hay bucle en el print()
  2. Hay un return() dentro de for(), por lo que el bucle solo se ejecuta una vez (la primera), ya que return() hace terminar la función inmediatamente
  3. No has inicializado ni declarado las variables globales. De hecho, es peligroso y confuso usar variables globales dentro de subrutinas

Este es un ejemplo muy bonito de programación, porque se puede resolver de muchas formas, por ejemplo con map(). Ahora bien, la premisa es de que tiene que ser una función la que devuelva el valor.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sentencia for()

Notapor explorer » 2009-11-21 08:20 @389

Yo pondré la solución de una-línea, aunque, desde luego, es solo un divertimento.

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> perl -le'$x=join(",",1..$_),print"numero=$x"for 1..10'
numero=1
numero=1,2
numero=1,2,3
numero=1,2,3,4
numero=1,2,3,4,5
numero=1,2,3,4,5,6
numero=1,2,3,4,5,6,7
numero=1,2,3,4,5,6,7,8
numero=1,2,3,4,5,6,7,8,9
numero=1,2,3,4,5,6,7,8,9,10
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Esta son otras soluciones:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -le'$x="numero=1";print("$x"),$x.=",$_"for 2..11'
perl -le'for(1..10){print"numero=",join",",1..$_}'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sentencia for()

Notapor explorer » 2009-11-21 09:23 @433

Esta es una solución para Perl v5.10 (las versiones para Perl v5.8 son muy fáciles, usando variables globales):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use 5.010;
  7.  
  8. sub a {
  9.     state $x;                   # $x y $a mantendrán sus valores en todas
  10.     state $a;                   # las llamadas a la función
  11.  
  12.     $x++;                       # Incrementamos $x
  13.  
  14.     $a .= $x == 1               # $a almacenará la cadena. Si el valor de $x es 1 (primera vuelta),
  15.         ?  "$x"                 # devolvemos el valor  "$x" (que ahora contiene un '1'); sino,
  16.         : ",$x"                 # devolvemos el valor ",$x" (el resto de vueltas)
  17.         ;                       # El valor lo agregamos a $a
  18.  
  19.                                 # El valor devuelto por la función es el último valor calculado ($a)
  20. }
  21.  
  22. for (1 .. 10) {
  23.     say 'numero=', a();
  24. }
  25.  
  26. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

aunque, realmente, queda igual de corta si seguimos usando la opción de la función join():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3.  
  4. sub a {
  5.     state $x;                   # $x mantendrá su valor
  6.  
  7.     $x++;                       # Incrementamos $x
  8.  
  9.     join q[,], 1 .. $x;         # Generamos la secuencia
  10.  
  11. }                               # El valor devuelto por la función es el último valor calculado
  12.  
  13. for (1 .. 10) {
  14.     say 'numero=', a();
  15. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Son dos formas distintas de resolver el problema: la primera va almacenando la generación de la secuencia, mientras que la segunda genera una secuencia completa cada vez que se llama a la función. El elegir una u otra depende de lo que necesitemos hacer después o de si la secuencia puede crecer de forma indefinida.

Este estilo de programación en el que un objeto o función almacena un estado que nos permite recorrer una secuencia o colección de objetos, se llama Iterador.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sentencia for()

Notapor erv-Z » 2009-11-21 17:25 @767

ok, ahora quiero hacer otra cosa.

Usaré una sentencia for() para ir incrementando los números hasta 10 pero en vez de ser 1,2,3,4,5,6, serán lo mismo pero en hexadecimal, pero antes de eso quiero capturar todos los números con un while...
o sea:

Ejemplo:

Luego entre el 1 convertido en hexadecimal pondré a los lados 999 también en hexadecimal y luego lo llamaré.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (147(\d+)147) { print "$1\n"; }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Descarté hacer la función for() como subrutina. Ahora la hago parte del código sin subrutina...

Saludos.
Última edición por erv-Z el 2009-11-21 18:20 @805, editado 3 veces en total
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Sentencia for()

Notapor explorer » 2009-11-21 17:46 @782

Pues ya nos contarás si lo consigues... porque yo no me he enterado de nada.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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

cron