• Publicidad

Trabajando con system y ``

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Trabajando con system y ``

Notapor otronovato » 2013-09-05 12:34 @565

EDITADO: 3 horas después de escribir este código ya lo había interpretado equivocadamente. Afortunadamente me doy cuenta de las cosas... A la tercera o la cuarta. :oops:

La edición afecta a mi "interpretación" de las operaciones efectuadas por el código que valida la ruta absoluta del archivo que paso a dpkg --search desde el fichero de datos. Si he mancillado los ojos de alguien mediante ese párrafo que he enviado a /dev/null... ¡Que me perdone! :roll:

Como estoy centrado en Perl lo utilizo ahora mismo hasta para pelar patatas, y dado que he tenido problemas con algunos archivos y debsums he escrito un programa que me diga, vía dpkg --search <absolute path file> qué módulos estarían comprometidos.

En el archivo debsums he metido los valores correspondientes a ficheros y configuraciones con valor debsums REPLACED o FAIL o missing.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use strict;
  4. use warnings;
  5. use utf8::all;
  6.  
  7. #Programa que recibe el archivo de errores de debsums y automatiza la localización de los
  8. #paquetes afectados y su reinstalación
  9.  
  10. my $dpkg_out;
  11. my %sanear;
  12.  
  13.  
  14. die "Uso: $0 \<fichero\>\n" unless(@ARGV == 1);
  15.  
  16. open my $ifh, "<", $ARGV[0] || die "$!\n";
  17.  
  18. while(<$ifh>){
  19.  
  20. #Tenemos que quedarnos con la ruta del fichero y desechar el resto de la línea.
  21. #/usr/share/keyrings/debian-archive-removed-keys.gpg                       FAILED
  22.  
  23.      if (m/(^\/[^\s\n]+)\s{1,}/){
  24.          $dpkg_out = `dpkg --search $1`;
  25.  
  26.      }
  27.      else {
  28.          next;
  29.      }
  30.  
  31.     my $paquete = $1 if($dpkg_out=~m/(^.+):\s/);
  32.     #say $paquete if (defined $dpkg_out);
  33.  
  34.      $sanear{$paquete}++ if( defined $dpkg_out);
  35.  
  36. }
  37.  
  38.  
  39. close $ifh;
  40.  
  41. say $_ for (sort keys %sanear);
  42.  
  43. 1;
  44.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Primer problema: la primera expresión regular.

La he montado por el viejo método de ensayo y error, que es lo que suele hacerse cuando no se sabe realmente lo que se está haciendo. Tiene la ventaja de que la comprendo y la desventaja de que no sé si hace bien lo que se supone que debe hacer en un caso general. Para el listado que proporciona debsums parece correcto... Pero si se tratara de capturar rutas procedentes del directorio /home no sería extraño encontrar directorios con nombres 'directorio \ con\ espacios\ en blanco'. Y éso ya es "sebo de otro cuenco".

Segundo problema: los bloques.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  if (m/(^\/[^\s\n]+)\s{1,}/){
  2.          $dpkg_out = `dpkg --search $1`;
  3.  
  4.      }
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $paquete = $1 if($dpkg_out=~m/(^.+):\s/);
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Es correcto este código?

En el segundo bloque, antes chequeaba el valor de retorno de `dpkg --search <fichero con ruta absoluta>` mediante system("dpkg", "--search", $_); pero se me eternizaba por lo que opté por el código que he puesto arriba. No obstante, supongo que ésta, la de system, es la forma correcta. ¿No?

El primer bloque intenta asegurar que la ruta absoluta que se pasa a dpkg es formalmente correcta. Pero me queda la duda de si la expresión regular captura adecuadamente todos los casos que se pueden dar en un fichero debsums.

La salida del programa parece correcta:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. xxxxx@xxxxxx:~/Documentos/MANTENIMIENTO$ ./localiza_pack.pl NUEVOS_ERRORES_DEBSUMS_2.txt  
  2. console-setup-linux 
  3. gnome-media 
  4. gnome-session-common 
  5. grub-common 
  6. libreoffice-common 
  7. libsane-hpaio 


Un saludo.

PS: OFF TOPIC He reinstalado estos módulos mediante aptitude reinstall <módulo> y los he reconfigurado mediante dpkg-reconfigure <módulo>, pero debsums sigue cantando. Teniendo en cuenta que rkhunter no da más que una alerta a causa de /usr/bin/unhide.rb, que parece ser un viejo falso positivo por lo que leo en la red... ¿Debo reinstalar mi sistema?
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Publicidad

Re: Trabajando con system y ``

Notapor explorer » 2013-09-05 20:03 @877

Las comillas invertidas (que es lo mismo que el operador qx()), hacen lo mismo que system(), pero con la diferencia está en lo que devuelven. Mientras que system() devuelve un código de estado, qx() devuelve el resultado de la salida de la ejecución del comando.

Hay que tener mucho cuidado con los patrones del tipo

/(^.+):\s/

El comodín '.+' significa capturar todo lo que se pueda, hasta el final, y luego ir retrocediendo hasta encontrar el carácter ':', y comprobar si el resto del patrón concuerda.

Si la exp. reg. no concuerda, quizás haya que poner más cosas en el patrón. No puedo decirte si está bien, porque desconozco cómo es la salida de ese comando. Veo en la página de manual que también devuelve un código de estado, así que por ahí a lo mejor es más fácil hacer lo que quieres.

No hace falta paréntesis alrededor de for e if, si están escritos en modo indirecto.

Si el sistema ha sido comprometido, pues sí, hay que reinstalar, pero... ¿estamos hablando de tu ordenador particular? ¿cómo han conseguido comprometerle? Lo dudo mucho... salvo que te dediques a visitar páginas web con fondo negro con foros donde se abusa de la letra 'k'. :)
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

Re: Trabajando con system y ``

Notapor otronovato » 2013-09-06 17:36 @775

Las comillas invertidas (que es lo mismo que el operador qx()), hacen lo mismo que system(), pero con la diferencia está en lo que devuelven. Mientras que system() devuelve un código de estado, qx() devuelve el resultado de la salida de la ejecución del comando.

Sí, éso había pensado. El problema es que al ejecutar dos veces dpkg el programa se ralentizaba mucho. Por eso decidí estudiar la salida del comando para ver si se había ejecutado con éxito o no. En principio funciona. Pero no me gusta. Otra forma sería capturar la salida de system(), estudiar el valor de retorno y tomar la cadena de resultado: una lista de dos elementos a partir de la cadena de salida, que muestra la cadena con el resultado y el valor de retorno del comando. Pero no sé si es necesario liarse tanto.

Hay que tener mucho cuidado con los patrones del tipo

/(^.+):\s/

El comodín '.+' significa capturar todo lo que se pueda, hasta el final, y luego ir retrocediendo hasta encontrar el carácter ':', y comprobar si el resto del patrón concuerda.]

Sí... Si me encuentro con una cadena donde aparecen dos veces el carácter ':', la he fastidiado. Nunca había trabajado con expresiones regulares complejas. Sólo cosas fáciles con grep en el trabajo cotidiano y en Perl, cosas poco más complejas. Pero mientras no me acabe de leer la documentación no te voy a molestar más con ésto.

Si el sistema ha sido comprometido, pues sí, hay que reinstalar, pero... ¿estamos hablando de tu ordenador particular? ¿cómo han conseguido comprometerle? Lo dudo mucho... salvo que te dediques a visitar páginas web con fondo negro con foros donde se abusa de la letra 'k'. :)

No visito ese tipo de páginas, aunque reconozco que cuando Google da resultados de una búsqueda en las primeras posiciones puede darse el caso de que entre en algunas de ellas. Y ya sabes, el conocimiento escaso suele rendir más angustias que frutos. :roll:

Un ejemplo de la salida de debsums (procesa ejecutables y configuraciones):

Sintáxis: [ Descargar ] [ Ocultar ]
  1. /usr/lib/accountsservice/accounts-daemon                   OK 
  2. /usr/share/dbus-1/interfaces/org.freedesktop.Accounts.User.xml        OK 
  3. /usr/share/dbus-1/interfaces/org.freedesktop.Accounts.xml           OK 
  4. /usr/share/dbus-1/system-services/org.freedesktop.Accounts.service      OK 
  5. /usr/share/doc/accountsservice/README                     OK 
  6. /usr/share/doc/accountsservice/TODO                      OK 
  7. /usr/share/doc/accountsservice/changelog.Debian.gz              OK 
  8. /usr/share/doc/accountsservice/changelog.gz                  OK 
  9. ... 
  10. /etc/console-setup/compose.ISO-8859-15.inc                FAILED 
  11. /etc/console-setup/compose.ISO-8859-4.inc                 FAILED 
  12. /etc/console-setup/compose.ISO-8859-13.inc                FAILED 
  13. ... 
  14. /usr/share/gstreamer-properties/gstreamer-properties.ui         REPLACED 
  15. /usr/share/gnome/help/gstreamer-properties/fr/gstreamer-properties.xml REPLACED 
  16. /usr/share/gnome/help/gstreamer-properties/th/gstreamer-properties.xml REPLACED 


Estos son los casos que se pueden dar en stdout.

En stderr avisa de aquellos archivos para los que no existe posibilidad de comprobación (missing ...)

Un saludo
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Trabajando con system y ``

Notapor explorer » 2013-09-06 19:49 @867

system() solo devuelve el código de estado (o de error) del resultado de la ejecución. No devuelve nada más.

Veo que la salida sigue un patrón: primero la ruta a un archivo, y luego un palabra (OK, FAILED, REPLACED...). En ese caso, obtener la última palabra es sencillo: /(\w+)$/
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

Re: Trabajando con system y ``

Notapor otronovato » 2013-09-07 05:27 @269

system() solo devuelve el código de estado (o de error) del resultado de la ejecución. No devuelve nada más.


Le estoy dando muchas vueltas por la salida de este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use utf8::all;
  4.  
  5. #Prueba de la salida de la función system()                                                                                                
  6.  
  7. die "Uso: $0 \<fichero\>\n" unless(@ARGV == 1);
  8.  
  9. open my $ifh, "<", $ARGV[0] || die "$!\n";
  10.  
  11. while(<$ifh>){
  12.      if (m/(^\/[^\s\n]+)\s{1,}/){
  13.          my $cadena = system("dpkg", "--search", $1);
  14.          say "Valor de retorno\t",$cadena;
  15.      }
  16.      else {
  17.          next;
  18.      }
  19. }
  20. close $ifh;
  21. 1;
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Una muestra del archivo que proceso:

/etc/console-setup/compose.ISO-8859-15.inc FAILED
/etc/console-setup/compose.ISO-8859-4.inc FAILED
/etc/console-setup/compose.ISO-8859-13.inc FAILED
/etc/console-setup/compose.ISO-8859-9.inc FAILED
/etc/console-setup/compose.ISO-8859-14.inc FAILED
/etc/console-setup/remap.inc FAILED
/etc/console-setup/compose.ISO-8859-1.inc FAILED
/etc/console-setup/compose.VISCII.inc FAILED
/etc/console-setup/compose.ISO-8859-2.inc FAILED
/etc/console-setup/compose.ISO-8859-3.inc FAILED
/etc/console-setup/compose.ISO-8859-7.inc FAILED
/usr/share/gstreamer-properties/gstreamer-properties.ui REPLACED
/usr/share/gnome/help/gstreamer-properties/fr/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/th/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/ca/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/es/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/pt_BR/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/it/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/cs/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/sv/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/ru/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/uk/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/en_GB/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/C/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/zh_CN/gstreamer-properties.xml REPLACED
/usr/share/gnome/help/gstreamer-properties/de/gstreamer-properties.xml REPLACED


La salida que tengo:

xxxx@xxxx:~/Documentos/scripts_criptografía$ ./loc_pack_system.pl errores_debsums.txt
console-setup-linux: /etc/console-setup/compose.ISO-8859-15.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-4.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-13.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-9.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-14.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/remap.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-1.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.VISCII.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-2.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-3.inc
Valor de retorno 0
console-setup-linux: /etc/console-setup/compose.ISO-8859-7.inc
Valor de retorno 0
gnome-media: /usr/share/gstreamer-properties/gstreamer-properties.ui
Valor de retorno 0
gnome-media: /usr/share/gnome/help/gstreamer-properties/fr/gstreamer-properties.xml
Valor de retorno 0
gnome-media: /usr/share/gnome/help/gstreamer-properties/th/gstreamer-properties.xml
Valor de retorno 0
gnome-media: /usr/share/gnome/help/gstreamer-properties/ca/gstreamer-properties.xml
Valor de retorno 0
gnome-media: /usr/share/gnome/help/gstreamer-properties/es/gstreamer-properties.xml
Valor de retorno 0


Como puede verse la cadena 'gnome-media: /usr/share/gnome/help/gstreamer-properties/es/gstreamer-properties.xml' que devuelve el programa es el valor al que deseo acceder, supongo que sale por stderr. Pero no consigo acceder al valor de retorno de la función '0', si todo va bien, y a la cadena citada.

Desde luego, acceder mediante una nueva lectura dpkg mediante `` no es práctico. Pero si puedo acceder a ese valor y al de retorno mediante system... Éso sí que funcionaría.

He probado redirigiendo stderr dentro de system: "2>&1", pero tampoco parece funcionar. Igual, simplemente me estoy empeñando en un imposible, dado que perldoc informa explícitamente:

The return value is the exit status of the program as returned by the "wait" call. To get the actual exit value, shift right by eight (see below). See also "exec". This is not what you want to use to capture the output from a command; for that you should use merely backticks or "qx//", as described in "`STRING`" in perlop.


Supongo que éste es uno de estos casos de los que avisa perldoc:

When "system"'s arguments are executed indirectly by the shell, results and return codes are subject to its quirks.


¿Se puede hacer lo que planteo o voy a lo seguro?

Un saludo
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Trabajando con system y ``

Notapor explorer » 2013-09-07 07:21 @348

Hay varias formas de acceder a la salida de stderr y stdout. Una de ellas es ejecutar un qx() o un open() del comando, agregando una redirección del stderr a un archivo temporal:

open(PIPE, "comando 2>$temporal |")

De esa manera ya puedes leer el resultado de la ejecución, lo que sale por stdout (con <PIPE>), y lo que sale por stderr (leyendo el archivo $temporal). Y el código del resultado, en la variable $?.

Una solución muy cómoda, que hace todo esto en una sola orden, es la función tap() del módulo Sysadm::Install. Este módulo se suele utilizar en ambientes de administración de máquinas, aunque cuenta con funciones para muchas cosas distintas.

Ejemplo:

my($stdout, $stderr, $exit_code) = tap("ls", "-R");
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

Re: Trabajando con system y ``

Notapor otronovato » 2013-09-08 10:32 @480

Mi intento ha sido el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl                                                                                                                            
  2.  
  3. use v5.14;
  4. use strict;
  5. use warnings;
  6. use utf8::all;
  7.  
  8. #Prueba de captura de la salida sdtdout y stderr de la función dpkg --search                                                               #mediante pipe.                                                                                                                            
  9.  
  10. die "Uso: $0 \<fichero\>\n" unless(@ARGV == 1);
  11.  
  12. open my $temp, ">", 'tmp.txt'|| die "$!\n";
  13. open my $ifh, "<", $ARGV[0] || die "$!\n";
  14.  
  15. while(<$ifh>){
  16.      if (m/(^\/[^\s\n]+)\s{1,}/){
  17.          say $1;#Así veo el parámetro de ruta de archivo que le estoy pasando a dpkg
  18.          open(PIPE,"dpkg --search $1 2>$temp|") || die "No puedo ejecutar dpkg\n";
  19.          while(<PIPE>){
  20.              say $?;
  21.              say $_;
  22.          }
  23.          close PIPE;
  24.      }
  25.      else {
  26.          next;
  27.      }
  28. }
  29. close $ifh;
  30. close $temp;
  31.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El archivo debsums ya lo he descrito en un mensaje anterior. La salida es:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. nando@debian:~/Documentos/scripts_criptografía$ ./loc_pack_system.pl errores_debsums.txt  
  2. /etc/console-setup/compose.ISO-8859-15.inc 
  3. sh: 1: Syntax error: "(" unexpected 
  4. /etc/console-setup/compose.ISO-8859-4.inc 
  5. sh: 1: Syntax error: "(" unexpected 
  6. /etc/console-setup/compose.ISO-8859-13.inc 
  7. sh: 1: Syntax error: "(" unexpected 
  8. /etc/console-setup/compose.ISO-8859-9.inc 
  9. sh: 1: Syntax error: "(" unexpected 
  10. /etc/console-setup/compose.ISO-8859-14.inc 
  11. sh: 1: Syntax error: "(" unexpected 
  12. ... 


El archivo tmp.txt queda siempre vacío.

Respecto a lo del módulo Sysadm::Install aún me veo muy verde como para ponerme a estudiar con detalle módulos muy especializados.

Entiendo que el mensaje de error es de bash, no de Perl. Pero el caso es que no le estoy pasando ni un paréntesis.

Un saludo.
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Trabajando con system y ``

Notapor explorer » 2013-09-08 11:55 @538

El error está en la parte

"dpkg --search $1 2>$temp|"

Resulta que $temp, unas líneas más arriba, lo has definido como un gestor de archivo, para escribir en 'tmp.txt'. Y claro: bash no tiene ni idea de qué hacer con un gestor de archivo de Perl. Ahí están los paréntesis.

Solución:
  • quita las líneas 12 y 30, porque no sirven para nada
  • cambia la línea 18 por
    open(PIPE, "dpkg --search $1 2>tmp.txt |") or die "No puedo ejecutar dpkg\n";
Recuerda: no puedes mezclar objetos internos de Perl con Bash. Es como mezclar agua con chinchetas: se puede, pero es muy raro que sirva para algo :)
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

Re: Trabajando con system y ``

Notapor otronovato » 2013-09-08 15:34 @690

¡Gracias!... ¡Ya lo tengo!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl                                                                                                                            
  2.  
  3. use v5.14;
  4. use strict;
  5. use warnings;
  6. use utf8::all;
  7. use Data::Dumper;
  8.  
  9. #Prueba de captura de la salida sdtdout y stderr de la función dpkg --search mediante pipe.
  10. die "Uso: $0 \<fichero\>\n" unless(@ARGV == 1);
  11.  
  12. my %packages;
  13.  
  14. open my $ifh, "<", $ARGV[0] || die "$!\n";
  15.  
  16. while(<$ifh>){
  17.      if (m/(^\/[^\s\n]+)\s{1,}/){
  18.  
  19.          open(PIPE,"dpkg --search $1 2>'tmp.txt'|") || die "No puedo ejecutar dpkg\n";
  20.          while(<PIPE>){
  21.  
  22.              unless($?){
  23.                  my $paquete = $_ =~m/(^.+):\s/;
  24.                  $packages{$1}++;
  25.              }
  26.  
  27.  
  28.          }
  29.          close PIPE;
  30.      }
  31.      else {
  32.          next;
  33.      }
  34. }
  35. close $ifh;
  36.  
  37. say Dumper \%packages;
  38.  
  39. 1;
  40.  
  41.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Este código cumple perfectamente con su cometido. Ahora habría que crear unas expresiones regulares "decentes", pero como de momento éso me queda lejos, diremos con Galileo "y sin embargo funciona". :lol:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(PIPE,"dpkg --search $1 2>'tmp.txt'|") || die "No puedo ejecutar dpkg\n";
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Me queda el mal sabor de boca de no haber entendido antes esta sentencia.

Hemos utilizado esta forma:

open FILEHANDLE,EXPR


La documentación en cambio sugiere esta otra:

For three or more arguments if MODE is "|-", the filename is interpreted as a command to which output is to be piped, and if MODE is "-|", the filename is interpreted as a command that pipes output to us.


Entiendo que es equivalente (por lo menos a mí me da igual resultado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(PIPE, "-|","dpkg --search $1 2>'tmp.txt'") || die "No puedo ejecutar dpkg\n";
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Un saludo, y de nuevo muchas gracias. :)
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Trabajando con system y ``

Notapor explorer » 2013-09-08 19:23 @849

En la línea 10, no necesitas "escapar" los caracteres '<' y '>'. Y el unless() está escrito en forma indirecta, así que no necesitas los paréntesis. Además, el uso de unless() no se aconseja, pues obliga al programador que no conoce mucho Perl a pensar más que si fuera un simple if(). La línea 10 quedaría
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. die "Uso: $0 <fichero>\n" if @ARGV != 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No necesitas comillas simples alrededor del nombre del archivo que almacenará los mensajes de error. La expresión ya está entrecomillada doble, y se pasará tal cual al shell (después de la interpolación de $1, claro).

Es recomendable usar 'or' en lugar de '||', para evitar sorpresas desagradables. Tienen un grado de precedencia distinto (la precedencia de operadores la tienes al principio de perlop).

Sobra toda la parte else { next; } (no hay nada entre el final del if() y el final del bucle while()).

En la expresión regular, usar {1,} es lo mismo que usar +. Lo dice en la sección Cuantificadores, del documento perlre:
El cuantificador "*" es equivalente a "{0,}", el cuantificador "+" a "{1,}" y el cuantificador "?" a "{0,1}".

Pusiste [^\s\n]+ para representar "cualquier conjunto de caracteres que sea distinto de un espacio en blanco o avance de línea". El caso es que \s ya engloba a \n :) . Y hay una forma más moderna para representar "que sea distinto de un espacio en blanco": si \s representa el espacio en blanco, \S es justo lo contrario.

Justo con eso, no necesitas indicar en el patrón que hay espacios en blanco después de capturar caracteres que no son espacios en blanco: la captura terminará justo cuando encuentre un espacio en blanco. Con el ancla ^ nos vale para indicar dónde se debe empezar a buscar por el patrón.

Para evitar escribir '\' delante de cada carácter '/', en la expresión regular, se puede cambiar los delimitadores del patrón, para que sea más sencillo de escribir:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.      if (m{^(/\S+)}) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo de usar '-|' ya está comentado en otro hilo, estos días.

La variable $paquete en la línea 23 no la estás usando para nada.
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 Administración

¿Quién está conectado?

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