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.
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.4
Salida:
Using 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:
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
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.