【问题标题】:How can I parse IP addresses and address ranges with Perl?如何使用 Perl 解析 IP 地址和地址范围?
【发布时间】:2010-04-13 01:29:14
【问题描述】:

我有 IP 列表:

238.51.208.96/28
238.51.209.180-199
238.51.209.100-109
238.51.213.2-254
...

我怎样才能轻松解析它们?我需要范围内的第一个和最后一个 IP。 对于第一行,我可以使用 Net::Netmask CPAN 模块,但是我可以用其他行做什么?

【问题讨论】:

    标签: perl ip-address


    【解决方案1】:

    试试Net::IP模块

    如果第二个模式不支持,你可能需要对 ips 进行一些更改,例如

    238.51.209.180-199
    

    238.51.209.180 - 238.51.209.199
    

    通过使用一些正则表达式,例如,

    $range =~ s/^((?:\d+\.){3})(\d+)-(\d+)$/$1$2 - $1$3/gm;
    

    完整脚本:

    use warnings;
    use strict;
    use Net::IP;
    my $range = "238.51.209.180-199";
    $range =~ s/^((?:\d+\.){3})(\d+)-(\d+)$/$1$2 - $1$3/;
    my $ip = new Net::IP ($range) || die;
    print $ip->ip (), "\n";
    print $ip->last_ip (), "\n";
    

    【讨论】:

    • my $ip = new Net::IP ("238.51.209.180-199") || die; 输出为Died at ./andrey-zentavr.pl line 5.
    • 谢谢。我也添加了/gm,我认为它需要多行标志
    • 我不想让我的脚本死掉。如果 Net::IP($range) 失败,我需要重新制作字符串以清除格式。
    • 那就改脚本吧。这只是一个例子。
    【解决方案2】:

    您可以使用 Regexp::Common::net 包匹配 IP 地址,并使用 CPAN 上任意数量的模块(包括 Network::IPv4AddrNetAddr::IPNet::CIDR)来操作它们(并获取网络掩码等)。

    【讨论】:

    • 我决定像这样使用 smt:# 检查,我们有什么范围格式? if($ipline =~ /^((?:\d+\.){3})(\d+)-(\d+)$/){ $ipline =~ s/^((?:\d+\.) {3})(\d+)-(\d+)$/$1$2 - $1$3/; }
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2013-11-23
    • 2014-10-11
    • 2011-12-01
    • 2020-10-07
    相关资源
    最近更新 更多