El problema está en el propio nombre del $usuario: contiene un '\', y ese es un carácter que es significativo para las expresiones regulares.
Tenemos que "escapar" su significado, para que la expresión regular busque por un '\' literal, y no otra cosa.
Una solución es usar "\Q ... \E" para que Perl "escape" esos caracteres extraños:
Using perl Syntax Highlighting
#!/usr/bin/perl
my @usuarios = qw<
PRODUCCION\Exchangeadmin
>;
while (my $linea = <DATA>) {
for my $usuario (@usuarios) {
if ($linea =~ m/\Q$usuario\E/) {
print "Encontrado: $linea";
}
}
}
__DATA__
-Oct 3 10:32:49 2011 VC:8:1 Slot 4: 1317630761: Used by PRODUCCION\Exchangeadmin on MSTDCBOSNA
-Oct 3 10:32:49 2011 VC:8:1 Slot 8: 1317630762: Infected file modified by AntiVirus Engine
-Oct 3 10:32:49 2011 VC:8:1 Slot 9: 1317630762: \root\fs_fb003\R\j2re1.4.2_08\bin\jucheck.exe
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
De todas maneras, como estamos buscando si una cadena está dentro de otra, es mucho más eficiente usar la función apropiada para eso: index() (o rindex(), según el caso). Nos devolverá un valor, que es la posición donde se encuentra lo que estamos buscando.
Using perl Syntax Highlighting
if (index($linea, $usuario) != -1) {
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Otra opción es la de meter a todos los usuarios ("escapados") en una gran "alternancia", de tal manera que la expresión regular solo se compila una vez:
Using perl Syntax Highlighting
#!/usr/bin/perl
my @usuarios = qw<
PRODUCCION\Exchangeadmin
jucheck
>;
my $usuarios = join q[|], map { quotemeta } @usuarios;
$usuarios = qr/$usuarios/o;
while (my $linea = <DATA>) {
if ($linea =~ $usuarios) {
print "Encontrado: $linea";
}
}
__DATA__
-Oct 3 10:32:49 2011 VC:8:1 Slot 4: 1317630761: Used by PRODUCCION\Exchangeadmin on MSTDCBOSNA
-Oct 3 10:32:49 2011 VC:8:1 Slot 8: 1317630762: Infected file modified by AntiVirus Engine
-Oct 3 10:32:49 2011 VC:8:1 Slot 9: 1317630762: \root\fs_fb003\R\j2re1.4.2_08\bin\jucheck.exe
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
quotemeta() hace lo mismo que "\Q...\E". Metemos a todos los usuarios en un patrón, separados con alternancias "|", y creamos una variable que almacena una expresión regular, con qr().
Así, nos ahorramos el bucle de @usuarios, y la expresión regular solo se ejecuta una vez por $linea.