• Publicidad

Paso de variables con USE

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

Paso de variables con USE

Notapor zangre » 2010-07-06 05:24 @266

Hola de nuevo.

Imagen

Bueno, aquí muestro un diagrama de actividades, de lo que tengo intención de hacer. Tengo ya codificado desde IR DB hasta el final, sólo, que en realizar consulta tendré que ampliarlo a una multitabla, pero todo a su tiempo.

El problema que me veo ahora, es que el módulo (.pm) que uso para conectar con la BBDD requiere de una DB para conectarse. ¿Es posible enviar un parámetro por 'use' o algo similar? La intención es que el usuario (mi compi) pueda crearse una bbdd al completo con sus tablas, subtablas y demás para realizar todas las consultas.

Gracias. :)
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Publicidad

Re: Paso de variables con USE

Notapor explorer » 2010-07-06 05:32 @272

Creo que no, que no se puede cargar un módulo indicando un parámetro. La lista de argumentos que admite use es para indicar qué símbolos del módulo queremos importar a nuestro espacio de nombres.

Lo que sí se puede hacer es cargar el módulo con use y luego llamar a uno de sus métodos para inicializarlo con ese argumento:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Módulo;

my $modulo = Módulo->new("argumento");
Coloreado en 0.004 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: Paso de variables con USE

Notapor zangre » 2010-07-06 05:40 @278

Vamos, que lo que se haría sería modificar ese argumento con lo que tú desees, ¿no? En mi caso el nombre de la database.

Sería como esto, ¿no? (ejemplo copiado de la red):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub TYPE::new {
  my ($class, %args) = @_;
  my $self = {};

  bless $self, $class;
  foreach my $attribute (keys %args) {
    $self->$attribute($args{$attribute});
  }
  return $self;
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $int_type = TYPE->new(NAME => 'INTEGER', LENGTH => 1);
my $string_type = TYPE->new(NAME => 'STRING', LENGTH => 2);
my $err_type = TYPE->new(NAME => 'ERROR', LENGTH => 0);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Paso de variables con USE

Notapor salva » 2010-07-06 08:15 @385

explorer escribiste:Creo que no, que no se puede cargar un módulo indicando un parámetro.

¡Si, si se puede!

El código...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Foo 'bar', 'doz';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

es equivalente a...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
BEGIN {
    require Foo;
    Foo->import('bar', 'doz');
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La mayoría de los módulos, lo que hacen es importar el método import del módulo Exporter que al ejecutarse enlaza en el package que ha hecho el use las subrutinas con los nombres que se han pasado como argumentos.

Pero en realidad nada nos impide declarar nuestro propio método import que haga lo que nosotros queramos. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
package Foo;
sub import {
  my $class = shift;
  print "$class->import(", join(" ", @_), ")\n";
};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De todas formas, esto de pasar parámetros en el use, no suele ser una buena idea, porque nos obliga a tener los parámetros disponibles en tiempo de compilación.

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $param = foo_param();
use Foo $param;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No va a hacer lo que esperaríamos a primera vista porque si consideramos cómo se expande el use y como el BEGIN se ejecuta nada más ser compilado, el resultado sería equivalente a...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $param;
require Foo;
Foo->import($param);
$param = foo_param();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así que aunque sí se pueda, en general ¡es mejor utilizar la solución que tu propones!
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Paso de variables con USE

Notapor zangre » 2010-07-07 06:29 @311

Vale, no soy capaz de sacarlo, seguramente he puesto mal el código.

Fichero que necesita la conexión:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $DATABASE = $Input{'database'};
ConectarDBNuevo -> new ("$DATABASE");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sólo pongo las dos sentencias necesarias.

Ahora el fichero de la conexión, que vamos es el típico sólo que le he añadido el new. :/

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/Applications/XAMPP/xamppfiles/bin/perl5
  2.  
  3. package ConectarDBNuevo;
  4.  
  5. use strict;
  6. use DBI;
  7.  
  8.  
  9. #usr y contr
  10. my $db_user = "root";
  11. my $db_pass = "1234";
  12.  
  13. #localhost y nombre db
  14. my $host_name = "localhost";
  15. my $db_name = '';
  16.  
  17.  
  18. sub new {
  19.   $db_name = @_;
  20. }
  21.  
  22. my $q_string = "DBI:mysql:host=$host_name;database=$db_name";
  23.  
  24.  
  25. sub connect{
  26.   return (DBI->connect ($q_string, $db_user, $db_pass,
  27.   {PrintError => 0, RaiseError => 1}));
  28. }
  29.  
  30. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La cosa es que no peta, por lo tanto el problema es en la secuencia SQL, así que presupongo que es que no coge bien la db en la qué buscar...

Lo que no acabo de ver es, si llamo a la función desde fuera ¿No hace falta llamarla aquí dentro? No lo acabo de ver claro.
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Paso de variables con USE

Notapor explorer » 2010-07-07 06:33 @314

Creo que la línea que está mal es la de

$db_name = @_;

ya que ahí estás evaluando un array en contexto escalar (hay una variable escalar en el lado izquierdo), por lo que, realmente, estás guardando el número de elementos de @_, y no su contenido.

Cámbiala por

($db_name) = @_;

o

$db_name = shift @_;

o

$db_name = shift;

(las tres hacen lo mismo).

Esto lo habrías visto antes si hubieras impreso el valor de las variables. Cuando un programa no funciona, es vital saber qué es lo que contienen las variables. Y una forma de hacerlo es con print(), printf(), say() o Data::Dump::Dumper().
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: Paso de variables con USE

Notapor zangre » 2010-07-07 06:47 @324

Vale, con razón a veces me hacía cosas raras con el @_.

Igualmente, en un .pm ¿se pueden imprimir las cosas? :o

No sé, pensaba que al ser un módulo para conectar, pues... tal vez no saldría nada por pantalla. No sé. :lol: Quieras o no, sigo bastante perdida y aún no sé cómo he llegado tan lejos. :wink:
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Paso de variables con USE

Notapor explorer » 2010-07-07 07:46 @365

zangre escribiste:Igualmente, en un .pm ¿se pueden imprimir las cosas?

Pues... cuestión de probar, ¿no?

Mientras la salida estándar no esté cerrada, se puede imprimir desde cualquier sitio de tu programa. Un módulo es un "añadido" al programa, es decir, las nuevas definiciones, métodos, funciones y variables son incorporadas al espacio de nombres de tu programa, como si los hubieras escrito tu mismo en tu programa.
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: Paso de variables con USE

Notapor zangre » 2010-07-08 02:23 @141

La verdad es que ya lo probé y no hubo manera de que me imprimiera nada.

Soy un desastre. :lol:

Otra cosita, las opciones que me pusiste no me sirven. :(

También probé en lugar de un new(), directamente en el conect que cogiera los datos y determinara cómo se había de conectar:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$dbh = ConectarDBNuevo->connect($Input{'database'}); #$Input{'database'} es el nombre de la BBDD que he recibido por GET desde la página anterior.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/Applications/XAMPP/xamppfiles/bin/perl5

package ConectarDBNuevo;

use strict;
use DBI;

my $db_user = "root";
my $db_pass = "1234";

my $host_name = "localhost";
my $db_name = '';


sub connect{
    $db_name = shift;
    my $q_string = "DBI:mysql:host=$host_name;database=$db_name";
    return (DBI->connect ($q_string, $db_user, $db_pass, {PrintError => 0, RaiseError => 1}));
}

1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y evidentemente, como todo código que hago yo, no funciona. :lol:

Iré probando alternativas. Todo será cuestión de encontrar la solución correcta. :)

El error que me sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
DBI connect('host=localhost;database=ConectarDBNuevo','root',...) failed: Unknown database 'conectardbnuevo' at /Applications/XAMPP/xamppfiles/lib/perl5/5.10.1/ConectarDBNuevo.pm line 19

For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo curioso es que me diga que la database es ConectarDBNuevo, cuando ese es el nombre del package. Seguro que envía mal las variables...
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Paso de variables con USE

Notapor explorer » 2010-07-08 14:31 @647

Tienes toda la razón, se nos ha colado algo importante del funcionamiento de Perl, cuando es orientado a objetos.

Cuando haces

$dbh = ConectarDBNuevo->connect($Input{'database'});

lo que hace Perl es meter en la pila de argumentos a la llamada connect() dos cosas:
* El $Input{'database'}, que es nuestro argumento, claro
* Una referencia al objeto que invoca el método connect(). En este caso, ConectarDBNuevo.

Así que entonces, lo que hay que hacer dentro de connect():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub connect{
    my $self = shift;
    $db_name = shift;
    # ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así, estamos leyendo los dos argumentos: primero, una referencia al propio objeto ConectarDBNuevo, y el segundo, nuestra base de datos.

Perdón por el lío.

Más información en perldoc perlmod.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron