我有一个大约 400MB 的大型网络文件。我有大约 11 个 IP 地址的数组。
我需要在整个文件中搜索这 11 个 IP 地址,但我的 Perl 脚本无法正常工作。我已将 IP 地址放入数组中,但不确定是否要为数组的每个元素打开文件,反之亦然。
#!/usr/bin/perl
use warnings;
use strict;
my @leaflogicservers = qw/
xx.117.189.181
xx.117.191.238
xx.117.185.80
xx.117.184.255
52.xxx.52.29
52.xxx.52.183
52.xxx.52.184
52.xxx.52.185
52.xxx.52.186
40.xxx.190.72
40.xxx.11.156
/;
my $PathToFile = 'router01.log';
open my $router01, '<', "$PathToFile" or die $!;
while ( my $ip = <$router01> ) {
chomp($ip);
for my $catch ( @leaflogicservers ) {
chomp($catch);
if ( $catch =~ m/$ip/ ) {
print "Caught!\n";
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以一次搜索所有这些内容。
#!/usr/bin/perl
use v5.14;
use warnings;
my @leaflogicservers = ...;
my $pat = join "|", map quotemeta, @leaflogicservers;
my $re = qr/\b(?:$pat)\b/;
while ( <> ) {
say "Found $&" if /$re/;
}
Run Code Online (Sandbox Code Playgroud)
perl的正则表达式引擎使用 trie 来进行常量字符串的重要替换,因此这是非常有效的,并且分解出公共前缀没有帮助。
修复\b了代码中的错误。例如,您的代码不正确匹配,152.xxx.52.29因为您的列表包含52.xxx.52.29. 这可以防止这种情况发生。
quotemeta修复另一个。您使用.(匹配除 LF 之外的任何字符) 而不是\.(匹配 a .)。
如果文件完全由 LF 终止的 IP 地址组成,则哈希将比正则表达式更快。
#!/usr/bin/perl
use v5.14;
use warnings;
my @leaflogicservers = ...;
my %leaflogicservers = map { $_ => 1 } @leaflogicservers;
while ( <> ) {
chomp;
say "Found $&" if $leaflogicservers{ $_ };
}
Run Code Online (Sandbox Code Playgroud)