• Publicidad

Búsqueda de parámetros en un archivo

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

Re: Búsqueda de parámetros en un archivo

Notapor situ » 2013-02-08 21:07 @921

Pude solucionarlo poniendo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cont_usuario = $cont_usuario;
  2.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2013-02-08 22:08 @964

En otras palabras: el programa tiene un error en algún sitio, porque esa línea no hace nada (puedes probar a comentarla y lo verás).
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: Búsqueda de parámetros en un archivo

Notapor situ » 2013-02-08 22:45 @989

Sin esa línea no me suma de todos los archivos. Por otro lado seguramente el programa tienen muchos errores y mucho código duplicado :S.

Voy a publicarlo para ver si a alguien le sirve y por otro lado para ver si alguien me ayuda a simplificarlo :D
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Búsqueda de parámetros en un archivo

Notapor situ » 2013-06-28 15:16 @678

explorer escribiste:Precisamente, el operador Coincidencia inteligente está para evitar muchos de los dobles bucles que hacíamos en el siglo pasado.

El truco está, primero, en ahorrar código sacando la información que nos interesa para que sea más fácil de tratar. En tu caso, hay que simplificar el acceso a @username, ya que estás continuamente extrayendo el nombre del usuario con una expresión regular. Mejor hacerlo una vez y ya está. Y segundo: usar la Coincidencia inteligente para comprobar la existencia de cada usuario en el array que nos interesa.

Aparte, te hago notar que para ejecutar solo la parte negada de un if(), puedes a) negar la condición, o b), usar unless().

Otro detalle: no puedes poner '>' dentro de un código HTML sin que pertenezca a una marca HTML. Debes escribirlo como '>'. Si no, estarás escribiendo HTML erróneo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my @busername = qw(
  4.     manolo
  5.     margarita
  6.     fungencio
  7. );
  8.  
  9. my @username =
  10.     ( 'username rosa acceso 1'
  11.     , 'username manolo acceso 2'
  12.     , 'username manolo acceso 3'
  13.     , 'username garcia acceso 1'
  14.     , 'username margarita acceso 2'
  15.     , 'username antonio acceso 3'
  16. );
  17.  
  18. my @usuarios_que_han_accedido;
  19. foreach my $acceso (@username) {
  20.     if (   $acceso =~ m/^username\s(.*)\sacceso/ ) {
  21.         push @usuarios_que_han_accedido, $1;
  22.     }
  23. }
  24.  
  25. foreach   my $usuario_que_ha_accedido (@usuarios_que_han_accedido) {
  26.     unless ( $usuario_que_ha_accedido ~~ @busername ) {
  27.         print "<tr><td>Usuario= $usuario_que_ha_accedido -&gt; MAL</td></tr>\n";
  28.     }
  29. }
  30.  
  31. foreach   my $usuario_del_sistema (@busername) {
  32.     unless ( $usuario_del_sistema ~~ @usuarios_que_han_accedido ) {
  33.         print "<tr><td>Usuario= $usuario_del_sistema -&gt; NO SE ENCUENTRA CONFIGURADO</td></tr>\n";
  34.     }
  35. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
<tr><td>Usuario= rosa -&gt; MAL</td></tr>
<tr><td>Usuario= garcia -&gt; MAL</td></tr>
<tr><td>Usuario= antonio -&gt; MAL</td></tr>
<tr><td>Usuario= fungencio -&gt; NO SE ENCUENTRA CONFIGURADO</td></tr>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Pero... en cuestiones de comparación, de existencia de un elemento dentro de un conjunto, es mucho mejor usar los hash. Lo siguiente es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;            # activa say(), strict y warnings;
  3. use CGI ':standard';
  4.  
  5. my @busername = qw(
  6.     manolo
  7.     margarita
  8.     fungencio
  9. );
  10.  
  11. my @username =
  12.     ( 'username rosa acceso 1'
  13.     , 'username manolo acceso 2'
  14.     , 'username manolo acceso 3'
  15.     , 'username garcia acceso 1'
  16.     , 'username margarita acceso 2'
  17.     , 'username antonio acceso 3'
  18.     );
  19.  
  20. my %usuarios_con_accesos;
  21. for my $acceso (@username) {
  22.     if ($acceso =~ /^username\s(.+?)\s/) {
  23.         $usuarios_con_accesos{$1} = 1;          # recordamos los usuarios que han accedido
  24.     }
  25. }
  26.  
  27. my %usuarios_del_sistema;
  28. for my $usuario (@busername) {
  29.     $usuarios_del_sistema{$usuario} = 1;        # recordamos los usuarios del sistema
  30. }
  31.  
  32. ## Vemos qué usuarios han accedido no están en el sistema
  33. # Para cada $usuario_accedido, de todos los %usuarios_con_accesos
  34. for my $usuario_accedido (keys %usuarios_con_accesos) {
  35.     # Si el $usuario_accedido no existe en el grupo de %usuarios_del_sistema
  36.     if (not exists $usuarios_del_sistema{$usuario_accedido}) {
  37.         say Tr(td("Usuario= $usuario_accedido -&gt; MAL"));                           # informamos
  38.     }
  39. }
  40.  
  41. ## Vemos qué usuarios del sistema no han accedido
  42. # Para cada $usuario_en_sistema, de todos los %usuarios_del_sistema
  43. for my $usuario_en_sistema (keys %usuarios_del_sistema) {
  44.     # Si el $usuario_en_sistema no existe en el grupo de %usuario_con_accesos
  45.     if (not exists $usuarios_con_accesos{$usuario_en_sistema}) {
  46.         say Tr(td("Usuario= $usuario_en_sistema -&gt; NO SE ENCUENTRA CONFIGURADO")); # informamos
  47.     }
  48. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
El resultado es el mismo, claro. Pero más rápido, ya que no hay búsquedas recorriendo listas de valores. Simplemente se compruebe la existencia o no de usuarios dentro de cada grupo.

Aparte... ¿qué ocurre si un usuario accede más de una vez...? Pues que con la solución de los array no nos daremos cuenta y lo reportaremos tantas veces como aparezca en la lista. Con los hash solo es "recordado" una vez, ya que las claves de los hash son únicas.


¿Cómo puedo hacer si ahora, aparte de tener la lista en "@busername" quiero poner un valor opcional? Digamos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @busername = qw(
  2.     manolo
  3.     margarita
  4.     fungencio
  5. o fulano
  6. o marcos
  7. );
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2013-06-28 16:43 @738

¿Qué significa eso de "opcional"? ¿que te da lo mismo si está o no?
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: Búsqueda de parámetros en un archivo

Notapor situ » 2013-06-28 18:11 @799

En verdad es que puede estar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @busername = qw(
  2.     manolo 1
  3.     manolo 2
  4.     margarita
  5.     fungencio
  6. );
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En algunos casos voy a tener que está como "manolo 1" y en otros casos "manolo 2".

Pero no quiero que me diga que está MAL si tiene "manolo 2", ya que puede puede estar en alguno de los 2 casos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2013-06-28 19:00 @833

Prueba con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @busername = (
  2.     'manolo 1',
  3.     'manolo 2',
  4.     'margarita',
  5.     'fungencio',
  6. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Humm... lo mejor sería reducir los dos manolos a uno solo...
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: Búsqueda de parámetros en un archivo

Notapor situ » 2013-06-28 19:07 @838

Recuerda que @busername, son los nombres que yo quiero que estén cuando hago la comprobación contra la regex que saca la información, por lo cual si solamente tengo "manolo 1", me va a decir que falta "manolo 2" y en verdad está bien que no esté, ya que está "manolo 1".

No puedo reducir a un solo manolo :S
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2013-06-29 06:42 @321

He encontrado una solución, con los datos que conocemos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI ':standard';
  3. use feature 'say';
  4.  
  5. my %usuarios_del_sistema = (
  6.     'manolo'    => 'manolo|manolo 1|manolo 2',
  7.     'margarita' => 'margarita',
  8.     'fungencio' => 'fungencio',
  9. );
  10.  
  11. # creo una regex con todos los nombres posibles
  12. my $usuarios_del_sistema       = join '|', values %usuarios_del_sistema;
  13. my $regex_usuarios_del_sistema = qr/$usuarios_del_sistema/;
  14.  
  15. my @accesos =
  16.     ( 'username rosa acceso 1'
  17.     , 'username manolo acceso 3'
  18.     , 'username manolo 1 acceso 3'
  19.     , 'username garcia acceso 1'
  20.     , 'username margarita acceso 2'
  21.     , 'username antonio acceso 2'
  22.     , 'username antonio acceso 3'
  23.     );
  24.  
  25. my %usuarios_con_accesos;
  26.  
  27. for my  $acceso (@accesos) {
  28.     if ($acceso =~ /^username\s(.+?)\sacceso/) {        # si tenemos un acceso
  29.         $usuarios_con_accesos{$1} = 1;                  # recordamos el usuario que ha accedido
  30.     }
  31. }
  32.  
  33. # creamos una regex con todos los accesos realizados
  34. my $usuarios_con_accesos       = join '|', keys %usuarios_con_accesos;
  35. my $regex_usuarios_con_accesos = qr/$usuarios_con_accesos/;
  36.  
  37.  
  38. ## Vemos qué usuarios que han accedido no están en el sistema
  39. for my  $usuario_accedido (keys %usuarios_con_accesos) {
  40.  
  41.     if ($usuario_accedido !~ /$regex_usuarios_del_sistema/) {   # si el usuario que ha entrado no está registrado en el sistema
  42.  
  43.         say Tr(td("Usuario= $usuario_accedido -&gt; MAL"));     # informamos de una entrada ilegal
  44.     }
  45. }
  46.  
  47. ## Vemos qué usuarios del sistema no han accedido
  48. while ( my ($usuario_del_sistema, $regex_usuario_del_sistema) = each %usuarios_del_sistema) {  # recorremos todos los usuarios del sistema
  49.  
  50.     my $ha_entrado;
  51.  
  52.     for my  $usuario_del_sistema_unico ( split '\|', $regex_usuario_del_sistema) {             # para cada nombre conocido de ese usuario
  53.  
  54.         if ($usuario_del_sistema_unico =~ /$regex_usuarios_con_accesos/) {                     # si sí ha entrado
  55.             $ha_entrado = 'sí';                                                                # lo marcamos
  56.             last;                                                                              # y terminamos el bucle para ese usuario
  57.         }
  58.     }
  59.  
  60.     if (not $ha_entrado) {                                                                     # informamos en el caso de que no haya entrado
  61.         say Tr(td("Usuario= $usuario_del_sistema -&gt; NO SE ENCUENTRA CONFIGURADO"));
  62.     }
  63. }
  64.  
  65. __END__
  66. SALIDA:
  67. <tr><td>Usuario= garcia -&gt; MAL</td></tr>
  68. <tr><td>Usuario= antonio -&gt; MAL</td></tr>
  69. <tr><td>Usuario= rosa -&gt; MAL</td></tr>
  70. <tr><td>Usuario= fungencio -&gt; NO SE ENCUENTRA CONFIGURADO</td></tr>
  71.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La solución es la siguiente: creamos un patrón que contiene todas las combinaciones de nombres conocidos en el sistema, y otro para los usuarios que han accedido.

El caso de saber qué usuarios han accedido al sistema sin estar registrados, la solución es igual que la que teníamos antes: una expresión regular que compruebe la coincidencia con los usuarios del sistema.

Para el caso de los usuarios del sistema que no han accedido, es un poco más complicado: hay que recorrer por cada usuario, por todos los nombres conocidos de ese usuario. Si no encontramos ninguno de esos nombres en el patrón de usuarios con accesos, entonces informamos de que el usuario no ha entrado. Ejemplo: para el caso de que haya entrado 'manolo 1', entonces ya no informa que 'manolo' o 'manolo 2' no han entrado.

La solución no es tan rápida como la anterior, pero es debido a la particularidad del problema.
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: Búsqueda de parámetros en un archivo

Notapor situ » 2013-06-29 16:56 @747

Disculpa que te moleste pero intenté llevar tu ejemplo a lo que tengo yo pero no lo logro, por este motivo te molesto para consultarte si podes ayudarme a adaptar todo.

Aquí busco la información que deseo comprobar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. elsif(m/^server\s(.*)/){
  2.     push (@server,$1);
  3. }                                                                              
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aquí tengo la configuración que tendría que estar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @bserver = ("1.1.1.1","testing","conectividad lan1");
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y aquí es donde comienzo con las comprobaciones y los avisos
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %server_con_accesos;
  2.  
  3. for my $server (@server) {
  4.     $server_con_accesos{$server} = 1;  
  5. }
  6.  
  7. my %server_del_sistema;
  8. for my $server2 (@bserver) {
  9.     $server_del_sistema{$server2} = 1;        
  10. }
  11.  
  12.  
  13. for my $server_accedido (keys %server_con_accesos) {
  14.     if (not exists $server_del_sistema{$server_accedido}) {
  15.         print F "<tr><td>config $server_accedido MAL</td></tr>\n";
  16.     }
  17. }
  18.  
  19. for my $server_en_sistema (keys %server_del_sistema) {
  20.     if (not exists $server_con_accesos{$server_en_sistema}) {
  21.        print F "<tr><td>config $server_en_sistema NO SE ENCUENTRA CONFIGURADO</td></tr>\n";
  22.     }
  23. }
  24.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora, identifiqué que puedo tener en algunos servidores "conectividad lan1", "conectividad wlan2" o "conectividad lan2" tal como te comentaba antes pero usando como ejemplo "manolo" y ya no me sirve como tengo el script.

Cabe aclarar que siempre voy a tener un tipo de "conectividad" y los otros parámetros a buscar como está en el ejemplo.

Muchas gracias.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron