• Publicidad

Problemas con referencia

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

Problemas con referencia

Notapor thegame » 2011-11-15 16:26 @726

Hola, ¿cómo están? Soy nuevo en el foro y nuevo en Perl también, ¡je,je,je,...! Necesito que me ayuden porque estoy realizando una aplicación, el código es el siguiente:

archivo1
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. .
  2. .
  3. .
  4. my $value=$query->param('busq');
  5. my $campo = new buscar;
  6. if ($value=~/[a-zA-Z]/){
  7.         $campo->busqueda($value);
  8.         print $query->a({href=>"most.pl?name=$campo->busqueda", -target=>'_self'},$campo->busqueda);
  9.                         }
  10.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


archivo2
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. .
  2. .
  3. .
  4. sub busqueda {
  5.  
  6.         $obj = shift;
  7.         $obj->{busqueda} = shift if @_;
  8.  
  9. my $dbh = DBI->connect("DBI:Pg:dbname=directorio;host=10.16.105.174;port=5432"."directorio","directorio","directorio");
  10. my $sth = $dbh->prepare("SELECT institucion.name, sede.name, ciudad.name, estado.name, pais.name, poder.name, customer_user.first_name, cargo.name, area.name FROM sede INNER JOIN institucion ON institucion.id=sede.id_institucion JOIN ciudad ON sede.id_ciudad=ciudad.id JOIN estado ON ciudad.id_estado=estado.id JOIN pais ON ciudad.id_pais=pais.id JOIN poder On institucion.poder_id=poder.id JOIN customer_user ON sede.id=customer_user.sede_id JOIN cargo ON cargo.id=customer_user.cargo_id JOIN area ON area.id=customer_user.area_id ORDER BY institucion.id");
  11. $sth->execute;
  12. while ( @selec = $sth->fetchrow_array()){
  13.         foreach $selec(@selec){
  14.                 if ($selec=~/$obj->{busqueda}/i){
  15.                         # print $selec;
  16.                          #$selec= my @resul;
  17.                         push (@resul, $selec);
  18.                         #return \@resul;
  19.                         #print $resul[0]."<A HREF=\"enlace1.pl\" TARGET=\"_self\">detalles<br></A>";
  20.  
  21.                                                 }
  22.                               }
  23.  
  24.                                         }
  25.        return \@resul;
  26.        
  27.           }
  28.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Entonces, lo que estoy haciendo es pasarle una variable a la subrutina búsqueda la compara con los datos de la BD y me devuelve un array con los resultados que sean iguales (hasta ahí todo bien...) Entonces, lo que quiero es devolver ese array al archivo 1, pero entonces en el print() del href "print $query->a({href=>"most.pl?name=$campo->busqueda", -target=>'_self'},$campo->busqueda);" en el archivo1 sí me muestra los datos pero cuando hago clic en el enlace quiero que me lleve el name a la otra página, pero me muestra: ARRAY(0x91a14a0) y no el valor del array.

Preguntas:
1.- Estuve leyendo sobre las referencias y probé todas las formas de llamar a las referencias de array y no me muestra valor, solo ARRAY.
2.- ¿Estoy haciendo bien la referencia en el sub? Probé tanto como con el "\" y sin él.

Gracias por la ayuda que me puedan prestar.
thegame
Perlero nuevo
Perlero nuevo
 
Mensajes: 38
Registrado: 2011-11-08 11:19 @513
Ubicación: Venezuela

Publicidad

Re: Problemas con referencia

Notapor explorer » 2011-11-15 17:00 @750

Bienvenido a los foros de Perl en español, thegame.

Del primer código, yo veo una cosa muy rara: estás llamando al método busqueda() tres veces. Mejor dicho: dos veces y una tercera dentro de una cadena, que al final no es ejecutado. Una vez en la línea 7 y dos en la línea 8. ¿Por qué?

Yo, lo que creo, es que solo necesitas llamarlo una vez.

Dentro de busqueda() guardas el término a buscar en $campo->{busqueda}. Y el resultado es una referencia a un array.

Entonces... yo lo que creo es que en realidad, es esto lo que quieres hacer (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $value = $query->param('busq');               # obtenemos el argumento
  2. my $campo = buscar->new;
  3. if ($value =~ /^[a-zA-Z]$/) {                    # el valor ha de ser solo letras
  4.     my @resultado = @{ $campo->busqueda($value) };    # @resultados, desreferenciando el resultado
  5.     for my $resultado (@resultado) {                  # para todos ellos
  6.         print $query->a({href=>"most.pl?name=$resultado", -target=>'_self'}, $resultado);
  7.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En cuanto a las preguntas...

Si en el sub pones un \@result, no estás devolviendo una lista de valores (los del array), sino solo un valor: la referencia al array (lo cual es muy óptimo, pues solo devuelve un solo valor). Quien llama a la subrutina debe tener en cuenta que está recibiendo una referencia, y por lo tanto, deberá tenerlo en cuenta si quiere acceder a los valores de ese array o solo almacenar esa referencia. En el problema que muestras, quieres acceder a los valores, así que usamos la desreferencia ( @{...} ) para obtener los valores del array y guardarlo en otro, y ya, ahora sí, que podemos iterar por ellos.

Pero si no la desreferencias, si sacas la referencia al exterior, aparecerá como ARRAY(...), indicando que has intentado pintar una referencia (no los valores del array).

Más información en perlref.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas con referencia

Notapor thegame » 2011-11-16 07:56 @372

Gracias, explorer, acabo de probar el código ¡¡y funcionó!! :D
thegame
Perlero nuevo
Perlero nuevo
 
Mensajes: 38
Registrado: 2011-11-08 11:19 @513
Ubicación: Venezuela


Volver a Básico

¿Quién está conectado?

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

cron