Если ваши критерии поиска являются регулярными выражениями, вы должны подготовить свое собственное скомпилированное регулярное выражение. Также обратите внимание на использование цикла while (при чтении файла), чтобы избежать чрезмерного использования памяти. Если вы хотите строки, содержащие любой из аргументов:
use strict;
use warnings;
my $searchRe = do {
my $searchCriteria = join '|', map "(?:$_)", @ARGV;
qr/$searchCriteria/i;
};
open my $fh, '<', 'vm.txt' or die $!;
while (<$fh>) {
print if m/$searchRe/;
}
close $fh;
или если вы хотите строки, содержащие все:
use strict;
use warnings;
my $searcher = do {
my @searchCriteria = map qr/$_/i, @ARGV;
sub {
# study; # study can help for long lines or lot of regular expressions
for my $re (@searchCriteria) {
return unless m/$re/;
}
return 1
}
};
open my $fh, '<', 'vm.txt' or die $!;
while (<$fh>) {
print if $searcher->();
}
close $fh;
(Обратите внимание, что вам может потребоваться \Q
и \E
вокруг $_
, если аргументы командной строки являются строками, а не регулярными выражениями.)
Наконец, если вы хотите улучшить скорость для многих критериев поиска, используйте Regexp :: Optimizer .
use Regexp::Optimizer;
my $searchRe = do {
my $searchCriteria = join '|', map "(?:$_)", @ARGV;
Regexp::Optimizer->new->optimize(qr($searchCriteria)i);
};