Isso é XML. Expressões regulares são um mau ajuste para XML , para todos eles parecem que deveriam trabalhar.
Isso ocorre porque o XML é contextual e a expressão regular não é. E o XML tem um monte de variações de formatação que são semanticamente idênticas, mas não combinam com a mesma regex.
Embora - pareça que nenhuma das entradas do seu 'segundo arquivo' corresponde ao seu primeiro arquivo no seu exemplo. Eu estou indo supor que você está querendo combinar o campo 'name' do XML embora. (Você deve evitar 'corresponder a qualquer atributo', se puder).
#!/usr/bin/perl
use strict;
use warnings;
#dumper is only needed for the 'print Dumper' line below
#for debugging. Both can safely be removed.
use Data::Dumper;
use XML::Twig;
open ( my $match_file, '<', 'file2' ) or die $!;
chomp ( my @matches = <$match_file> );
my %lookup = map { $_ => 1 } @matches;
#or if you want a more pithy one that IMO is a bit harder to understand.
#my %lookup = map { s/[\r\n]+//gr => 1 } <$match_file>;
print Dumper \%lookup;
my $twig = XML::Twig -> new -> parsefile ( 'file2' );
#xpath is XMLs equivalent of regex, but it's
#more suited to node and attribute matching.
foreach my $app ( $twig -> get_xpath ( '//app' ) ) {
$app -> print if $lookup{$app->att('name')};
#Alternatively extract a single field.
print "XML: ", $app -> att('xml'),"\n";
}
Como um forro? Honestamente, eu não faria, se você quiser fazer ambos a leitura dos jogos - e - a busca / impressão.
Mas, para um único elemento, eu talvez fosse:
a="UAT/CZ/LIMS/T068_01/LIMS-QA-S03" perl -MXML::Twig -e 'XML::Twig -> new ( twig_handlers => { 'app' => sub { $_ -> print if $_ -> att('name') eq $ENV{'a'} } } ) -> parse ( { do {local $/; <> } )'
Mas honestamente - eu preferiria escrever "forma longa" ao invés de tentar encenar alguma mágica em uma única linha - se você tentar ler todos os seus padrões, você acabará com um algoritmo ineficiente, e se você tentar e fazê-los all , então você está fazendo uma leitura de arquivo duplo e uma estrutura de dados no mesmo liner, e isso é apenas confuso.