• Publicidad

Nombres de variables dinamicos

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Nombres de variables dinamicos

Notapor Lor » 2005-08-28 09:45 @447

Ante todo Muchas gracias, al que pueda ayudarme con esto

Desde un form mando a un PL un conjunto de parametros con mombre del tipo
$nombreVariable$i con $i=0...........n

Es decir el pl recibe un nro de parametros que varia segun el caso:

$nombreVariable1, $nombreVariable2............$nombreVariablen

Mi problema es como asigno el parametro recibido ( $q->param('nombreVariable'.$i) a cada una de las variables que tomaran los valores de los parametros recibidos.

POR EJEMPLO:

my $i=1;
while ( $i <= $numero_parametros_recibidos)
{
my $parametro$i = $q->param('nombreVariable' . $i ) ;
$i++
}

LO QUE NECESITO SABER ES COMO COLOCO LA SETENCIA DE ASIGNACION PARA LOGRAR EN EL CASO DE $i= 5 POR EJEMPLO


$parametro5 = $q->param('nombreVariable5);

Espero me comprendan . Muchisimas gracias. :D
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Publicidad

Notapor Perl user » 2005-08-28 13:47 @615

Que tal,

Mira es claro el hecho de que tu caso necesita 'symbolic references', pero no lo recomiendo, no cuando tienes la facilidad de manejar hashes y arreglos para ese sencillo problema.

De todos modos te dejo una solución usando symbolic references, y luego la que yo te recomiendo.
Código: Seleccionar todo
use strict;

my $foo = 'bar';
my $bar = 'baz';
{
   no strict 'refs';
   $$foo = 'weee'; # cambiando el valor de $main::bar a 'weee'
}
   print $main::bar; #imprime 'weee'
   print $bar; #imprime 'baz'


Que significa esto? que todo movimiento a tus variables 'autogeneradas' tendrás que hacerlo dentro del bareblock del 'no strict refs', ya que si no lo haces, perl abortará y advertirá que no puedes usar una cadena para hacer referencias simbólicas hacia los nombres de variables ( lo cual es seguro y de muy buen estilo, por algo te lo dice el intérprete ).
Y como podrás observar $main::bar y $bar son variables diferentes, pero por qué? sencillo, las variables declaradas por my no pertenecen a ningún paquete, son creadas y alojadas en tiempo de compilación y por tanto, en tiempo de ejecución no puedes generarlas, caso contrario con variables de paquete o globales, las cuales puedes generar cuando quieras, pero únicamente usando su nombre completamente calificado ( es decir, especificando el paquete ), a menos que se use our. Esto es, para cumplir tu acometido tendrás que generar variables globales.

Sin embargo, teniendo la facilidad de usar un hash, o simplemente un arreglo ya que tus posiciones son secuenciales, por qué no hacer:
Código: Seleccionar todo
my %params;
for ( 1..10 ) {
    $params{ 'parametro' . $_ } = $q->param( 'Parametro' . $_ );
}
print $params{parametro1};


Puedes consultar sobre referencias simbólicas en perlref y el capítulo 8 de Programming Perl 3rd Edition.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Ejemplo de variables ref

Notapor explorer39 » 2005-08-28 14:32 @647

Código: Seleccionar todo
#!/usr/bin/perl

use diagnostics;
use strict;
no strict 'refs';

our $parametro1;
our $parametro2;
our $parametro3;
our $parametro4;
our $parametro5;
our $parametro6;

# Parametros enviados por el usuario
my @params = qw(Hola amigos de toda la vida);

my $i = @params;

for( my $j = 1; $j <= $i; $j++ )
{
  # Asignamos los valores
  ${"parametro$j"} = $params[$j-1];

  # Los pintamos como prueba
  print ${"parametro$j"}," ";
}

# Ejemplo de uso
print "\nPues ", $parametro1, "!\n";
explorer39
 

Re: Ejemplo de variables ref

Notapor Perl user » 2005-08-28 17:01 @751

explorer39 escribiste:
Código: Seleccionar todo
#!/usr/bin/perl

use diagnostics;
use strict;
no strict 'refs';

our $parametro1;
our $parametro2;
our $parametro3;
our $parametro4;
our $parametro5;
our $parametro6;

# Parametros enviados por el usuario
my @params = qw(Hola amigos de toda la vida);

my $i = @params;

for( my $j = 1; $j <= $i; $j++ )
{
  # Asignamos los valores
  ${"parametro$j"} = $params[$j-1];

  # Los pintamos como prueba
  print ${"parametro$j"}," ";
}

# Ejemplo de uso
print "\nPues ", $parametro1, "!\n";


No deberías hacer esa recomendación, es un PÉSIMO estilo de programación, y algo que no se debe hacer, mucho menos apagar strict 'refs' para todo el código.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Re: Ejemplo de variables ref

Notapor explorer39 » 2005-08-28 17:47 @782

Perl user escribiste:No deberías hacer esa recomendación, es un PÉSIMO estilo de programación, y algo que no se debe hacer, mucho menos apagar strict 'refs' para todo el código.
Saludos,

En el asunto del mensaje pone EJEMPLO, no RECOMENDACIÓN.
Y si apago strict fuera es por no hacer el ejemplo demasiado largo... tampoco hay que ser tan exigente con un ejemplo, por favor... :(
explorer39
 

Re: Ejemplo de variables ref

Notapor Perl user » 2005-08-28 17:50 @784

explorer39 escribiste:
Perl user escribiste:No deberías hacer esa recomendación, es un PÉSIMO estilo de programación, y algo que no se debe hacer, mucho menos apagar strict 'refs' para todo el código.
Saludos,

En el asunto del mensaje pone EJEMPLO, no RECOMENDACIÓN.
Y si apago strict fuera es por no hacer el ejemplo demasiado largo... tampoco hay que ser tan exigente con un ejemplo, por favor... :(


hehe ok ;)

Pero es curioso mira, hace tiempo tuve una misma conversación ( o al menos similar ) con eiial, sobre ejemplos dados en el foro. Es sencillo dar ejemplos, y jamás he criticado en general que la gente de ejemplos, hablo pues que generalmente la gente aprende viéndolos, y pues lamentablemente la mayoría aprende viendo MALOS ejemplos... y eso nos lleva a que un buen estilo y buenas prácticas jamás existan entre nuestros hábitos, al contrario, es bueno que al principiante se le exhorte a programar con buenos hábitos y buenas prácticas ( y al final hasta para nosotros mismos es genial ). Pero creeme, de ninguna manera dije que no pongas ejemplos, o que haya estado mal que lo hicieras :)
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Re: Ejemplo de variables ref

Notapor explorer39 » 2005-08-28 18:15 @802

Perl user escribiste:hablo pues que generalmente la gente aprende viéndolos, y pues lamentablemente la mayoría aprende viendo MALOS ejemplos... y eso nos lleva a que un buen estilo y buenas prácticas jamás existan entre nuestros hábitos, al contrario, es bueno que al principiante se le exhorte a programar con buenos hábitos y buenas prácticas ( y al final hasta para nosotros mismos es genial :)
A ver...
Yo distingo claramente cuando pongo un ejemplo en qué foro estoy (principiantes, intermedio, experto, etc.) asi que intento poner un ejemplo acorde al foro, porque supongo que un experto 'sabe' lo que se 'debe' hacer o no. Vamos, se 'supone' :D
Otra cosa... he repasado todo el código que tengo en mi lugar de trabajo y de 99 códigos en perl, en 2 utilizo el truco de las referencias simbólicas. Y mirando el código por ver si quedaría mejor con un hash... pues sí... aunque el número de llaves que tengo que poner pues es el mismo :D
De
Código: Seleccionar todo
my $file = "$tmpdir/${zona}_" . ${"file_$f"} . '.*.img';
a
Código: Seleccionar todo
my $file = "$tmpdir/${zona}_" . $var{"file_$f"} . '.*.img';
explorer39
 

Notapor Perl user » 2005-08-28 18:28 @811

Yo uso referencias simbólicas para generar entradas dinámicas en la tabla de símbolos en tiempo de ejecución, cuando necesito generar accesores y/o mutadores, establecer algún alias o modificar alguna variable de algún paquete diferente que no se sabe en tiempo de compilación. Pero para casos simples como el anterior creo que no lo he hecho en mucho tiempo, no recuerdo alguno en estos momentos.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924


Volver a Avanzado

¿Quién está conectado?

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