• Publicidad

Problema con system()

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

Problema con system()

Notapor Jaume85 » 2008-10-27 12:59 @582

¡¡Hola a todos!! Es mi primer post :$ He leído y buscado en el foro sobre mi problema pero no he encontrado nada parecido.

Estoy usando el siguiente comando en un programa Perl:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system("zmu -m 2 -E");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Funciona perfectamente, pero el problema que tengo es que el número "2" es variable y tendría que provenir de una variable llamada $id.

He probado concatenando así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system("zmu -m ".$id." -E");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No me funciona T·T

Si alguien tiene alguna sugerencia es bienvenida ^^

¡¡GRACIAS!!
Jaume85
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-10-27 12:42 @571

Publicidad

Notapor explorer » 2008-10-27 13:18 @596

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

Yo creo que el problema está en lo que contiene $id.

Si se trata de un único valor, y con caracteres normales, entonces te valdría con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system("zmu -m $id -E");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es si $id contiene caracteres que pueden realizar una "expansión" en la shell (metacaracteres), o espacios en blanco (estaríamos pasando varios parámetros en lugar de uno solo).

La solución más sencilla sería entrecomillar al parámetro díscolo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system("zmu -m \"$id\" -E");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En este caso es entrecomillado doble, pero podría ser también el simple, para evitar futuras expansiones de metacaracteres.

O, yo también probaría con otra versión distinta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system('zmu', "-m $id -E");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esta versión no hace una expansión de los metacaracteres que pudiera contener $id ('?', '*', '[', '{', etc. etc.).

Es recomendable una lectura cuidadosa de system(), pues verás que también realiza una división por palabras, por lo que le afectará también que $id contenga espacios en blanco. En ese caso, hay que forzar el entrecomillado.

Quizás conque nos digas qué aspecto tiene $id, sabremos más del problema.
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

Notapor Jaume85 » 2008-10-28 05:41 @278

Antes de todo gracias por responder tan rápido.

He probado las distintas posibilidades y no funciona. El parámetro $id proviene de una instrucción enviada por puerto serie tipo '2|enable|' donde quiero que el identificador se habilite o deshabilite.
El siguiente código es donde se inicia la variable $id que proviene del mensaje enviado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub handleMessage

{

        my $connection = shift;

        my $message = shift;



        my ( $id, $action, $score, $cause, $text, $showtext ) = split( /\|/, $message );

        $score = 0 if ( !defined($score) );

        $cause = "" if ( !defined($cause) );

        $text = "" if ( !defined($text) );
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Donde $id siempre es un número.

No entiendo por qué no funciona. Gracias.
Jaume85
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-10-27 12:42 @571

Notapor explorer » 2008-10-28 06:57 @331

El siguiente ejemplo sí funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

print 'Introduce un número: '; $numero = <>;

chomp $numero;  # Quitamos el retorno de carro por ser entrada desde el teclado

print "El número introducido es: [$numero]\n";

print 'Ejecutando: '; system("echo $numero");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si no te fías de lo que contiene $id, mira cómo he puesto el print(), usando corchetes, para saber exactamente, qué aspecto tiene.

Y si no es $id, quizás el problema esté en otro sitio.
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

Notapor Jaume85 » 2008-10-29 04:03 @210

Gracias, ya está solucionado. Era el espacio que dejaba al final UU.

¡Gracias, explorer!
Jaume85
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-10-27 12:42 @571


Volver a Básico

¿Quién está conectado?

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

cron