首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在blib/lib/NetAddr/IP.pm没有包或对象引用的情况下,无法调用方法"network“

在blib/lib/NetAddr/IP.pm没有包或对象引用的情况下,无法调用方法"network“
EN

Stack Overflow用户
提问于 2014-06-29 17:23:53
回答 2查看 688关注 0票数 1

我试图编写一个Perl脚本来获取一个IPv4聚合列表和另一个地址列表,并使用NetAddr::IP获取每个IP,并将其与聚合列表进行比较,以查看它是否属于任何聚合。我需要找出哪些不是我所拥有的聚合列表的一部分。

我终于克服了所有的Perl错误,现在我看到的NetAddr::IP模块出现了一些错误。有人能帮忙吗?

下面是我遇到的错误:

代码语言:javascript
运行
复制
    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.

下面是我使用的代码:

代码语言:javascript
运行
复制
    #!/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示例:

代码语言:javascript
运行
复制
    1.1.0.0/16
    2.2.0.0/18

地址示例:

代码语言:javascript
运行
复制
    1.1.1.1
    192.168.2.3
    5.2.3.4
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-29 20:03:58

你给new打了两次电话。

代码语言:javascript
运行
复制
for $ip (map { new NetAddr::IP->new($_) } @ips)

您的代码可以清理到以下内容:

代码语言:javascript
运行
复制
#!/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;

产出:

代码语言:javascript
运行
复制
1.1.1.1 found within 1.1.0.0/16
192.168.2.3 not found
5.2.3.4 not found
票数 1
EN

Stack Overflow用户

发布于 2014-06-30 14:22:15

感谢Miller改进了我的代码版本。我只是重新发布与$afile$sfile变量互换,所以我们寻找的是ips内的ips,而不是在ips(这打破了之前的代码在我原来的文章)。下面的代码非常适合我。

代码语言:javascript
运行
复制
    #!/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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24478473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档