<tr><td>Usuario= garcia -> MAL</td></tr>
<tr><td>Usuario= antonio -> MAL</td></tr>
<tr><td>Usuario= fungencio -> NO SE ENCUENTRA CONFIGURADO</td></tr>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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.Salida:Using perl Syntax Highlighting
#!/usr/bin/perl my @busername = qw( manolo margarita fungencio ); my @username = ( 'username rosa acceso 1' , 'username manolo acceso 2' , 'username manolo acceso 3' , 'username garcia acceso 1' , 'username margarita acceso 2' , 'username antonio acceso 3' ); my @usuarios_que_han_accedido; foreach my $acceso (@username) { if ( $acceso =~ m/^username\s(.*)\sacceso/ ) { push @usuarios_que_han_accedido, $1; } } foreach my $usuario_que_ha_accedido (@usuarios_que_han_accedido) { unless ( $usuario_que_ha_accedido ~~ @busername ) { print "<tr><td>Usuario= $usuario_que_ha_accedido -> MAL</td></tr>\n"; } } foreach my $usuario_del_sistema (@busername) { unless ( $usuario_del_sistema ~~ @usuarios_que_han_accedido ) { print "<tr><td>Usuario= $usuario_del_sistema -> NO SE ENCUENTRA CONFIGURADO</td></tr>\n"; } }Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4Using text Syntax Highlighting<tr><td>Usuario= rosa -> MAL</td></tr>
<tr><td>Usuario= garcia -> MAL</td></tr>
<tr><td>Usuario= antonio -> MAL</td></tr>
<tr><td>Usuario= fungencio -> 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: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.Using perl Syntax Highlighting
#!/usr/bin/perl use v5.14; # activa say(), strict y warnings; use CGI ':standard'; my @busername = qw( manolo margarita fungencio ); my @username = ( 'username rosa acceso 1' , 'username manolo acceso 2' , 'username manolo acceso 3' , 'username garcia acceso 1' , 'username margarita acceso 2' , 'username antonio acceso 3' ); my %usuarios_con_accesos; for my $acceso (@username) { if ($acceso =~ /^username\s(.+?)\s/) { $usuarios_con_accesos{$1} = 1; # recordamos los usuarios que han accedido } } my %usuarios_del_sistema; for my $usuario (@busername) { $usuarios_del_sistema{$usuario} = 1; # recordamos los usuarios del sistema } ## Vemos qué usuarios han accedido no están en el sistema # Para cada $usuario_accedido, de todos los %usuarios_con_accesos for my $usuario_accedido (keys %usuarios_con_accesos) { # Si el $usuario_accedido no existe en el grupo de %usuarios_del_sistema if (not exists $usuarios_del_sistema{$usuario_accedido}) { say Tr(td("Usuario= $usuario_accedido -> MAL")); # informamos } } ## Vemos qué usuarios del sistema no han accedido # Para cada $usuario_en_sistema, de todos los %usuarios_del_sistema for my $usuario_en_sistema (keys %usuarios_del_sistema) { # Si el $usuario_en_sistema no existe en el grupo de %usuario_con_accesos if (not exists $usuarios_con_accesos{$usuario_en_sistema}) { say Tr(td("Usuario= $usuario_en_sistema -> NO SE ENCUENTRA CONFIGURADO")); # informamos } }Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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.
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados