我试图编写一个Perl脚本来获取一个IPv4聚合列表和另一个地址列表,并使用NetAddr::IP获取每个IP,并将其与聚合列表进行比较,以查看它是否属于任何聚合。我需要找出哪些不是我所拥有的聚合列表的一部分。
我终于克服了所有的Perl错误,现在我看到的NetAddr::IP模块出现了一些错误。有人能帮忙吗?
下面是我遇到的错误:
Can't call method "network" without a package or object reference at blib/lib/NetAddr/IP.pm (autosplit into blib/lib/auto/NetAddr/IP/compactref.al) line 1075.下面是我使用的代码:
#!/usr/bin/perl
use strict;
use NetAddr::IP;
my $fh = ();
my $sfile = "/home/dkenne201/ex-addresses.txt";
my $afile = "/home/dkenne201/aggs.txt";
my @space;
my @ips;
my $ip;
open($fh, "<", $sfile)
or die "Failed to open file: $!\n";
while(<$fh>) {
chomp;
push @space, $_;
}
close $fh;
open($fh, "<", $afile)
or die "Failed to open file: $!\n";
while(<$fh>) {
chomp;
push @ips, $_;
}
close $fh;
for my $netblock (NetAddr::IP::compact @space)
{
for $ip (map { new NetAddr::IP->new($_) } @ips)
{
if ($ip->within($netblock)) {
print "$ip found within $netblock\n";
}
else {
print "$ip not found within $netblock\n";
}
}
}下面是包含数据的文本文件中的格式示例。
Aggs示例:
1.1.0.0/16
2.2.0.0/18地址示例:
1.1.1.1
192.168.2.3
5.2.3.4发布于 2014-06-29 20:03:58
你给new打了两次电话。
for $ip (map { new NetAddr::IP->new($_) } @ips)您的代码可以清理到以下内容:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use NetAddr::IP;
my $sfile = "/home/dkenne201/ex-addresses.txt";
my $afile = "/home/dkenne201/aggs.txt";
my @netblocks = do {
open my $fh, "<", $sfile;
my @space = <$fh>;
chomp @space;
map {NetAddr::IP->new($_)} @space;
};
open my $fh, "<", $afile;
while (<$fh>) {
chomp;
my $ip = NetAddr::IP->new($_);
if (my ($netblock) = grep {$ip->within($_)} @netblocks) {
print "$_ found within $netblock\n";
} else {
print "$_ not found\n";
}
}
close $fh;产出:
1.1.1.1 found within 1.1.0.0/16
192.168.2.3 not found
5.2.3.4 not found发布于 2014-06-30 14:22:15
感谢Miller改进了我的代码版本。我只是重新发布与$afile和$sfile变量互换,所以我们寻找的是ips内的ips,而不是在ips(这打破了之前的代码在我原来的文章)。下面的代码非常适合我。
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use NetAddr::IP;
my $sfile = "ex-addresses.txt";
my $afile = "aggs.txt";
my @netblocks = do {
open my $fh, "<", $afile;
my @space = <$fh>;
chomp @space;
map {NetAddr::IP->new($_)} @space;
};
open my $fh, "<", $sfile;
while (<$fh>) {
chomp;
my $ip = NetAddr::IP->new($_);
if (my ($netblock) = grep {$ip->within($_)} @netblocks) {
print "$_ found within $netblock\n";
} else {
print "$_ not found\n";
}
}
close $fh;https://stackoverflow.com/questions/24478473
复制相似问题