在perl中查找子网中的所有IP

时间:2016-07-14 09:26:57

标签: perl ip-address

我有一个带子网掩码的IP,想要创建一个表,其中每一行都是一个IP。

有点像这样:

IP          | MAC  | Alive 
192.168.1.1 | ...  | yes
192.168.1.2 | ...  | no
192.168.1.3 | ...  | yes
...

对于子网/ 24的范围,这很容易,因为我可以生成从0到254的for循环,但是我在生成带有/ 21子网的表时遇到问题。有没有办法在perl中找到最小主机,最大主机及其间的所有内容?

我已经检查了Net::IPNetAddr::IP模块,但似乎不能解决我的问题。但是,我是一个perl新手,所以我可能会忽略它。

编辑: 找到了如何找到第一个和最后一个地址:

my $range = "IP/subnet" ;
my $ip = new Net::IP ($range) || die;
print $ip->ip (), "\n";
print $ip->last_ip (), "\n";

现在我需要在

之间找到IP

2 个答案:

答案 0 :(得分:4)

您可以使用NetAddr::IPnth method执行此操作。我创建了一个辅助子,它使用单例来创建迭代器。您从子网传入任何IP,它为您提供了一个代码引用,您可以接收下一个IP地址对象。它将在范围用尽之前执行此操作,此时它将返回o

undef

因为use strict; use warnings 'all'; use NetAddr::IP; use feature 'say'; sub make_ip_iterator { my $ip = shift; my $mask = NetAddr::IP->new($ip); my $i = 0; return sub { return $mask->nth($i++); } } my $iterator = make_ip_iterator('192.168.1.1/21'); while (my $ip = $iterator->()) { say $ip; } $mask$i子句中的词法,所以您可以多次调用它,并为您同时使用的不同子网获取不同的迭代器。

您当然可以只使用make_ip_iterator循环和计数器变量来实现它,因为while在使用子网外的索引调用时将返回nth(),但此解决方案是更便携。

答案 1 :(得分:3)

Net::IP的文档有一个示例,说明如何在looping部分执行此操作。

演示:

use Net::IP;

my $ip = new Net::IP("192.168.42.16/28");
do {
  print $ip->ip(), "\n";
} while (++$ip);
192.168.42.16
192.168.42.17
192.168.42.18
192.168.42.19
192.168.42.20
192.168.42.21
192.168.42.22
192.168.42.23
192.168.42.24
192.168.42.25
192.168.42.26
192.168.42.27
192.168.42.28
192.168.42.29
192.168.42.30
192.168.42.31

如果您只有所需范围内的IP,而不是前缀,则可以从地址和网络掩码中计算前缀。尝试这样的事情(虽然可能有一种更聪明的方法来实现这个目标,但是这让我不知道):

Net::IP