• Publicidad

Comparación de cadenas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Comparación de cadenas

Notapor aalleexx81 » 2009-05-04 15:25 @684

En este trocito de código nunca entra en el if():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if(-e $F_GRUP){
    open(ENTRADA1, $F_GRUP) or die "Error: no se puede abrir el fichero $!";   
    while($linea1 = <ENTRADA1>){
        @linea1 = split /:/, $linea1; # Meto en el vector los campos de /etc/grup
        print "linea1[3] vale $linea1[3]";
        if ($linea1[3] eq "") {
            print "EOOOO";
            @names = split /,/, $linea1[3]; # Meto en un vector los nombres de los usuarios secundarios
        }
        print "\n";
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4


No sé si estoy utilizando bien los operadores de comparación. Espero que podáis ayudarme.
Gracias
aalleexx81
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2009-05-04 15:21 @681

Publicidad

Notapor explorer » 2009-05-04 15:32 @689

Bienvenido a los foros de Perl en Español, aalleexx81.

Si no entra en el if() primero, es que no existe el fichero cuyo nombre está en la variable $F_GROUP.

Si no entra en el segundo if() es porque $linea[3] no es igual a una cadena vacía. ¿No será que en vez de eq sea ne?
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

comparación de cadenas

Notapor aalleexx81 » 2009-05-04 15:45 @698

El fichero $F_GROUP no está vacío, eso seguro XD. Es el segundo if el que no hace lo que quiero. Hay veces en las que $linea1[3] esta vacía y veces en que no. Pero poniendo eq y ne no me hace absolutamente nada. Estoy un poco desesperado.
aalleexx81
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2009-05-04 15:21 @681

comparación de cadenas

Notapor aalleexx81 » 2009-05-04 16:03 @710

Me acabo de dar cuenta de que $linea1[3] nunca estaba vacía, ya que contenía salto de línea. Apliqué chop() y problema solucionado. Gracias por la ayuda.
Saludos
aalleexx81
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2009-05-04 15:21 @681

Notapor explorer » 2009-05-04 16:07 @713

Modifica la línea del print() así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "linea1[3] vale [$linea1[3]]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Fíjate que le he añadido unos corchetes y un carácter de fin de línea.

El objetivo es que el programa nos muestre exactamente qué es lo que se ha recibido en $linea1[3].

Si a veces está vacía y otras no, eso depende de la forma que tenga $linea1.

Como veo que estás leyendo el fichero /etc/group, entonces ese cuarto campo sí que puede estar vacío. Y, como después, te interesa separar por comas el nombre de usuarios, entonces tienes que entrar en el if() cuando la línea sea distinta de cadena vacía (ne).

Un detalle importante: debes agregar la línea chomp($linea1); inmediatamente después de la lectura del while() para que Perl quite el retorno de carro de $linea1. Ese carácter podría molestarnos para los ulteriores cálculos. Es más, creo que es la razón por la cual te falla el if().
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

comparación de cadenas

Notapor aalleexx81 » 2009-05-04 16:28 @727

Estás en lo cierto. Vaya quebradero de cabeza. Lo hice como acabas de decir y me funciona a la perfección. De nuevo, mil gracias por tu tiempo.
aalleexx81
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2009-05-04 15:21 @681

Pues yo tengo el mismo problema ..

Notapor dwong » 2009-06-22 02:21 @139

Muchachos, yo tengo un problema similar que espero puedan ayudarme..

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$prefijo = "90002";

use DBI;

$db="base_datos";
$host="localhost";
$port="3306";
$userid="root";
$passwd="clave";
$connectioninfo="DBI:mysql:database=$db;$hOCost;$port";

$dbh = DBI -> connect($connectioninfo,$userid,$passwd);

$consulta = $dbh -> prepare("select * from celulares where prefijo=$prefijo");
$consulta -> execute();

while(@resultado=$consulta -> fetchrow_array()){
        $proveedor=$resultado[2];
        $localidad=$resultado[3];

        $dato=chop($proveedor);
        print "Proveedor=($dato)";
}

$consulta -> finish();
$dbh -> disconnect;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema está en que cuando $prefijo es igual a un valor que no está en la base de datos pues no me muestra ningún resultado, es decir, no ejecuta el print() y creo que debería mostrar: Proveedor=() pero no muestra nada... espero me puedan apoyar ya que no sé por dónde más buscar...

Muchas gracias...

Dwong. (Editado...)
Última edición por dwong el 2009-06-22 08:51 @410, editado 1 vez en total
dwong
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-06-22 02:08 @130

Notapor explorer » 2009-06-22 03:08 @172

Bienvenido a los foros de Perl en Español, dwong.

Te falta la llave de cierre ('}') del bucle while().
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

Notapor dwong » 2009-06-22 08:53 @412

Sorry, fue un error mio al copiar el código (acabo de editarlo), el código original sí tiene el cierre del bucle pero cuando el código sigue sin mostrar nada, solo muestra espacio vacío y me devuelve al prompt..

¿Alguna idea...? Gracias.

Slds.,

Dwong.
dwong
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-06-22 02:08 @130

Notapor explorer » 2009-06-22 10:01 @459

El tema está justo en la comprobación del while().

Dices que cuando buscas por una palabra que NO está en la base de datos, no aparece el texto que quieres.

Es que es eso lo que realmente le has dicho a Perl que haga...

El bucle que has escrito dice: mientras me devuelvas un arreglo correspondiente a la consulta, haz lo siguiente (imprimir el texto).

Pero el caso es que si buscas por una palabra que no está, fetchrow_array() devolverá una lista vacía. Y una lista vacía es como un valor falso para el bucle while(), por lo que no entrará y no imprimirá nada.

El manual de DBI, en fetchrow_array(), dice:
If there are no more rows or if an error occurs, then fetchrow_array returns an empty list. You should check $sth->err afterwards (or use the RaiseError attribute) to discover if the empty list returned was due to an error.
que quiere decir,
Si no hay más líneas o si ocurre un error, entonces fetchrow_array devuelve una lista vacía. Debes comprobar $sth->err después (o usar el atributo RaiseError) para descubrir si la lista vacía devuelta fue debida a un error.


Puedes hacer la siguiente prueba: quita el 'while()', '{', y '}', y deja la condición y las sentencias, para que se ejecuten siempre.
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 Intermedio

¿Quién está conectado?

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