Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » Error al ejecutar system("echo") Responder al tema
Nuevo tema


Página 1 de 1  [ 4 mensajes ] 
 
Nota Mar Sep 07, 2010 11:51 pm

Perlero Nuevo
Registrado: Jue Ago 26, 2010 12:46 am
Mensajes: 4
Error al ejecutar system("echo")
Hola, de nuevo =P.

Les cuento que soy un feliz usuario de una Mac, la cual tiene luces bajo las teclas que se manejan con sus correspondientes teclas en el teclado. Las luces funcionan perfectamente: al modificar un archivo con un número se encienden y se cambia la intensidad. Vi por ahí que había un script para bindearlo a las teclas y así poder cambiarlas con las del teclado, pero sin embargo, ya que estoy aprendiendo Perl, decidí hacer el mio propio, y me estoy volviendo loco.

Lo siguiente funciona perfectamente.
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $mas = 2;
  3. system("echo $mas > /sys/class/leds/smc::kbd_backlight/brightness");
  4.  


Este es mi script, el cual no funciona correctamente (corriéndolo como root, por supuesto)

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use warnings;
  3.  
  4. my $salto = 25.5;
  5.  
  6. open(ARCHIVO, "/sys/class/leds/smc::kbd_backlight/brightness") || die("No se encontro el Archivo de Brightness\n");
  7. @intensidad = <ARCHIVO>;
  8. close(ARCHIVO);
  9. chomp(@intensidad[0]);
  10.  
  11.  
  12. my $var = @intensidad[0];
  13. my $mas = $var + $salto;
  14. my $menos = $var - $salto;
  15.  
  16. if($ARGV[0] eq up){
  17.         system("echo $mas > /sys/class/leds/smc::kbd_backlight/brightness");
  18. }elsif($ARGV[0] eq down){
  19.         system("echo $menos > /sys/class/leds/smc::kbd_backlight/brightness");
  20. }else{
  21.         print "No se encontro el archivo\n";
  22. }
  23.  


Corriendo mi script me encuentro con este error:

root[@]/home/jsanchez/Scripts#./kb-backlight.pl up
sh: line 0: echo: write error: Invalid argument


He buscado el error en Google y la mayoría de las cosas que saltan son bugs, que no pretendo entender de qué se habla. Pero la razón del post, es que...

¿Por qué el primero funciona, y el segundo no?

Edito: sí, también probé con comillas en: eq "up" || "down"

Saludos.


Nota Mié Sep 08, 2010 6:03 am
Avatar de Usuario
Perlero Frecuente
Registrado: Jue Ene 03, 2008 3:19 pm
Mensajes: 175
Re: Error al ejecutar system(echo) - Me tiene loco.
¿No será que $menos toma un valor negativo?

Prueba poniendo un guion doble después de echo en la llamada a system:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
system("echo -- $menos > /sys/class/leds/smc::kbd_backlight/brightness");


Nota Mié Sep 08, 2010 10:36 am

Perlero Nuevo
Registrado: Jue Ago 26, 2010 12:46 am
Mensajes: 4
Re: Error al ejecutar system("echo")
Ya lo encontré, el problema era que el archivo en el que intentaba escribir, no aceptaba números con coma.

Saludos y Gracias.


Nota Mié Sep 08, 2010 11:42 am
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
Re: Error al ejecutar system("echo")
Hay una serie de errores, que no lo son tanto porque Perl los permite, pero que hay que entenderlos porque puede darnos problemas más tarde.

@intensidad[0]

Este es uno de los problemas que tienen las personas que empiezan con Perl: sabemos que @intensidad es un array, pero cuando queremos obtener un solo elemento de ese array, queremos obtener un solo elemento, un escalar. Por eso, lo correcto es escribir

$intensidad[0]

Lo primero, con la '@', quiere decir: "quiero obtener una lista de elementos, compuesta del elemento primero de @intensidad". Aunque lo parezca, no es lo mismo que "quiero obtener el primer elemento de @intensidad". En algunas situaciones, en las que el contexto sea importante, esta pequeña diferencia puede provocar problemas.

$ARGV[0] eq up

Aquí, el error es que "up" no está entrecomillado. Perl, intentará ejecutar la función up(), y si no la encuentra, lo tratará como una palabra constante, que era justo lo que queríamos al principio. Así que es mejor escribirlo como

$ARGV[0] eq 'up'

Lo mismo para 'down', claro.

_________________
JF^D Perl programming


Responder al tema  [ 4 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO