Bienvenido a los foros de Perl en español, Lalomuva.
El asunto no es obvio ya que, además de buscar las palabras, las debemos contar. No podemos usar una expresión regular (al menos, sencilla), porque podría darse el caso de que una palabra apareciera repetida, usurpando la aparición de otras palabras.
Entonces... podemos hacer un doble bucle para comprobar la existencia de cada palabra, en cada elemento:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my @elemento =
( 'HPY2525: 2695|AAD08039.1 9424|ADU82245.1 F32|BAJ58597.1 hB8|CBI66079.1 Ind7|ADU79976.1 Li75|ADU83917.1 P12|ACJ08500.1 S464|ADO06203.1'
, 'HPY2525: 9424|ADU82245.1 F32|BAJ58597.1 hB8|CBI66079.1 Li75|ADU83917.1 P12|ACJ08500.1 S464|ADO06203.1'
, 'HPY2841: 9424|ADU81058.1 C20|ADO03382.1 Ind7|ADU80418.1'
);
my @busqueda = qw(
2695| 9424| F32| hB8| Ind7| Li75| P12| S464|
);
my @comunes;
for my $elemento (@elemento) { # buscamos por todos los elementos
my $numero_palabras = 0; # contador de palabras encontradas, a cero
for my $palabra (@busqueda) { # para todas las palabras que buscamos
$numero_palabras += $elemento =~ /\b\Q$palabra\E\b/; # buscamos esa $palabra, en ese $elemento
}
if ($numero_palabras == @busqueda) { # si el $numero_palabras encontradas is igual a las que buscamos
print "Encontrado en [$elemento]\n";
push @comunes, $elemento; # guardamos el elemento
}
}
__END__
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Hay que aclarar la expresión regular: usamos '\b' (delimitador de palabra) para asegurarnos que la palabra que buscamos no está dentro de una palabra mayor, o pegada a alguna otra. Debe ser una palabra completa, y suelta. Y el escapado '\Q...\E' nos permite usar caracteres extraños como si formaran parte de la palabra a buscar, y no formar parte de la propia expresión regular: es el caso de los caracteres '|', que son significativos para las expresiones regulares (significan alternancias de búsqueda), así que deberíamos haber puesto
Using perl Syntax Highlighting
my @busqueda = qw(
2695\| 9424\| F32\| hB8\| Ind7\| Li75\| P12\| S464\|
);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
pero ese trabajo de colocar las '\' ya lo hace por nosotros '\Q...\E'.
Otra forma de escribirlo:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my @elemento =
( 'HPY2525: 2695|AAD08039.1 9424|ADU82245.1 F32|BAJ58597.1 hB8|CBI66079.1 Ind7|ADU79976.1 Li75|ADU83917.1 P12|ACJ08500.1 S464|ADO06203.1'
, 'HPY2525: 9424|ADU82245.1 F32|BAJ58597.1 hB8|CBI66079.1 Li75|ADU83917.1 P12|ACJ08500.1 S464|ADO06203.1'
, 'HPY2841: 9424|ADU81058.1 C20|ADO03382.1 Ind7|ADU80418.1'
);
my @busqueda = qw(
2695| 9424| F32| hB8| Ind7| Li75| P12| S464|
);
@busqueda = map { qr/\b\Q$_\E\b/ } @busqueda; # escapamos los caracteres extraños, y creamos patrones
my @comunes;
for my $elemento (@elemento) { # buscamos por todos los elementos
my $numero_palabras = grep { $elemento =~ $_ } @busqueda; # buscamos en $elemento, por todos los patrones de @busqueda
if ($numero_palabras == @busqueda) { # si el $numero_palabras encontradas is igual a las que buscamos
print "Encontrado en [$elemento]\n";
push @comunes, $elemento; # guardamos el elemento
}
}
__END__
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí, escapamos y reconvertimos las palabras a buscar en expresiones regulares, antes de aplicarlas a cada $elemento.