用perl实现IP地址字符串转换为单个IP

2017-09-01 11:45:55来源:CSDN作者:haiqinma人点击

分享

在工作中,我们常常会遇到对多个节点进行处理的情况。为了方便我们可能会将ip地址书写为一个范围比如192.168.1.100-192.168.1.150,并不会将这个51个ip全部写出来,但是在后续处理的时候,我们有可能需要对这些节点分别处理。
这里分享一下用perl来实现这样的功能。
需求:读取一个ip地址信息的字符串,ip地址之间用逗号或者冒号隔开,冒号表示2个ip地址之间的所有IP,但是不能包含最后一位是255或者是0的ip,比如192.168.10.200:192.168.11.10, 这样的写法是认为不合法的。

my $hosts_ip_info="192.168.1.5:192.168.1.9,192.168.1.3, 192.168.2.11 , 192.168.3.45, 192.168.5.37:192.168.5.32 ";my @all_host_ip = &get_hosts_ip($hosts_ip_info);print"all the hosts ip are as follows: @all_host_ip";exit 0;sub get_hosts_ip () {    my ($hostListStr) = (@_);    my @hosts;    my @ip_split_by_comma = split(',',$hostListStr);    foreach my $string_split_by_comma(@ip_split_by_comma) {        if ( $string_split_by_comma =~ /:/ ) {            push @hosts, &get_continuous_hosts($string_split_by_comma);        } else {            push @hosts, &check_ip_format($string_split_by_comma);        }    }    return @hosts;}sub get_continuous_hosts () {    my $hostListStr = $_[0];    my @hostParaArray = split(':',$hostListStr);    my $lower_ip = $hostParaArray[0];    $lower_ip = &check_ip_format($lower_ip);    $lower_ip =~ m/(/b((([01]?/d/d?|2[0-4]/d|25[0-5])/.){3})([01]?/d/d?|2[0-4]/d|25[0-5]))/b/;    #获取ip地址的前面3个数字    my $prefix_lower_ip = $2;    #获取ip地址的最后1个数字    my $suffix_lower_ip = $5;    my $upper_ip = $hostParaArray[1];    $upper_ip = &check_ip_format($upper_ip);    $upper_ip =~ m/(/b((([01]?/d/d?|2[0-4]/d|25[0-5])/.){3})([01]?/d/d?|2[0-4]/d|25[0-5]))/b/;    my $prefix_upper_ip = $2;    my $suffix_upper_ip = $5;    #判断冒号前后的IP是否存在跨越255或者0的情况    if ( $prefix_upper_ip ne $prefix_lower_ip ) {        die "ip $lower_ip to ip $upper_ip is cross $prefix_lower_ip"."255 or $prefix_upper_ip"."0. Please modify it!!/n";    }    my @continuous_host;    #冒号分隔的ip地址,应该是前面为较小的IP,后面为较大的IP,否则,两者交换一下    if ( $suffix_upper_ip < $suffix_lower_ip ) {        my $tmp = $suffix_lower_ip;        $suffix_lower_ip = $suffix_upper_ip;        $suffix_upper_ip = $tmp;        $tmp = $lower_ip;        $lower_ip = $upper_ip;        $upper_ip = $tmp;    }    push @continuous_host, $lower_ip;    for (my $index = $suffix_lower_ip+1; $index < $suffix_upper_ip; $index++ ) {        push @continuous_host, $prefix_lower_ip.$index;    }    push @continuous_host, $upper_ip;    return @continuous_host;}#检查ip是否合乎规范sub check_ip_format () {    my ($ip_str) = (@_);    $ip_str =~ s//s//g;    if ($ip_str =~ /(/b((([01]?/d/d?|2[0-4]/d|25[0-5])/.){3})([01]?/d/d?|2[0-4]/d|25[0-5]))/b/ ) {        return $ip_str;    } else {        die "the format ip address $ip_str is not right!";    }}

对于上述代码,欢迎大家交流,指正

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台