Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

¿Por qué falla la consulta?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Jue Mar 08, 2007 8:48 am
javierg
Perlero Nuevo
Perlero Nuevo
Registrado: 17 Oct 2006
Mensajes: 48
¿Por qué falla la consulta? Responder citando

Buenas, tenga esta línea de código en Perl.
Perl:
$dia= system("date |awk '{printf $3}' ");

y no se por qué me falla.

Lo que quiero conseguir es el número de día solamente.

La idea de utilizar esto, es porque con un date normal, por ejemplo el día 7 lo toma como 07 y yo solo quiero el 7.

gracias
Mensaje Jue Mar 08, 2007 9:00 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

system() devuelve el resultado de la ejecución, NO la salida de la ejecución. Para esto, debes usar qx();

Otra cosa... para saber la fecha del día, no necesitas programas externos a Perl, sino el propio Perl:
Perl:
$dia = (localtime)[3];
Mensaje Jue Mar 08, 2007 9:09 am
javierg
Perlero Nuevo
Perlero Nuevo
Registrado: 17 Oct 2006
Mensajes: 48
Responder citando

efectivamente,
mucho mas simple y funciona

gracias
Mensaje Jue Mar 08, 2007 9:58 am
javierg
Perlero Nuevo
Perlero Nuevo
Registrado: 17 Oct 2006
Mensajes: 48
Responder citando

este valor que devuelve es un entero

hay alguna forma de pasarlo a caracter.
He probado a meterlo en un split, y luego a sacar el valor, pero me falla
Mensaje Jue Mar 08, 2007 10:14 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

¿Puedes poner el código y la salida?
Mensaje Jue Mar 08, 2007 2:29 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

javierg escribió:
este valor que devuelve es un entero

hay alguna forma de pasarlo a caracter.
He probado a meterlo en un split, y luego a sacar el valor, pero me falla


Eso me sonó a "circo, maroma y teatro".....

El contexto de un escalar (aquí menciono contexto como el tipo de dato interno o su representación interna), es reflejado en cómo lo usas:

$a = 5; # Numérico
"$a" # obviamente convierte eso a cadena
"$a" + 5 # valor numérico por tratarse de una operación aritmética

Y lo mismo pasará cuando compares un valor escalar en forma de cadena y en forma numérica.

Si quieres represenaciones específicas lee sobre la función sprintf.

Saludos,

PD. Es necesario leer un poco más sobre aspectos básicos de los tipos de datos en Perl.
Mensaje Vie Mar 09, 2007 1:07 am
javierg
Perlero Nuevo
Perlero Nuevo
Registrado: 17 Oct 2006
Mensajes: 48
Responder citando

señores porfavor ....

Perl:
$dia=(localtime)[3];
@dia = split/ /,$dia;
print " el valor es @dia";


$dia es un entero, intento pasarlo por un split para sacarlo como carácter,
pero ese valor que me devuelve sigue siendo un entero.
Mensaje Vie Mar 09, 2007 2:31 am
javierg
Perlero Nuevo
Perlero Nuevo
Registrado: 17 Oct 2006
Mensajes: 48
Responder citando

Adjunto el código.
Perl:
$dia = (localtime)[3];
@dia = split/ /, $dia;
while ($i > $j) {
    $error = "false";
    system ("ls -l /export/home/psaxbck/$almacen[$j] > /tmp/lsCOMP");
    open(DIRCOMP, "$Dir_COMP") or die ("no se puede abrir el fichero /tmp/lsCOMP");
    while ($linea = <DIRCOMP>) {
        #$valor5 = (split " ",$linea)[5];
        $valor6 = (split " ",$linea)[6];
        $fecha = $valor6;
        if ( @dia eq fecha ){
            #$error = "true";
            #$fallido[$k] = $almacen[$j];
            $k++;
        }
    }
    print "el valor de dia es $dia y el valor de fecha es $fecha\n";
    #if ($error eq "true") {
        print " fallo en el back de $almacen[$j]\n";
    }
    close(DIRCOMP);
    $j++;


Cuando quito el ultimo if, funciona OK. Pero cuando lo pongo me sale el siguiente error
Código:
Use of uninitialized value in string at pruebabackup.pl line 77, <DIRCOMP>

Lo de sumar un número a un escalar, o poner comillas a una variable numérica, ya lo probé hace tiempo. Aunque ahora dudo de que en esto venga el problema.
Mensaje Vie Mar 09, 2007 2:52 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

El problema está aquí:
Perl:
if ( @dia eq fecha ) {
¿Qué narices es eso?

Estás comparando un array con un literal, por lo que Perl pasa el array @dia a formato escalar, es decir, nos devuelve la longitud de la lista almacenada en @dia, como un entero.

Pero a continuación, haces una comparación de cadena ('eq') por lo que convierte el entero devuelto antes por el array a un string, y lo compara con fecha, que al ser un literal, lo convierte al string 'fecha' (por lo que, sospecho, debería ser corregido a $fecha, definida una línea antes).

A ver... tu lo que quieres es saber si la $fecha es el día de hoy... entonces, nos podemos olvidar de @dia. Necesitaríamos saber el formato del dato de día que extraemos desde la $linea, pero supongamos que es el mismo que el que nos devuelve localtime (valores de 1 a 31, sin relleno de cero o espacios).

Entonces... el 'if' quedaría así:
Perl:
if ( $dia eq $fecha ) {
Si el formato de la $fecha es distinto, quizás habrá que hacer la comparación de otra manera...

Pero recuerda... Perl NO tiene variables escalares DISTINTAS para números y para strings. Y un array NO almacena strings, sino listas de escalares (que, ocasionalmente, pueden ser strings o caracteres).
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group