我有一个带子网掩码的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::IP
和NetAddr::IP
模块,但似乎不能解决我的问题。但是,我是一个perl新手,所以我可能会忽略它。
编辑: 找到了如何找到第一个和最后一个地址:
my $range = "IP/subnet" ;
my $ip = new Net::IP ($range) || die;
print $ip->ip (), "\n";
print $ip->last_ip (), "\n";
现在我需要在
之间找到IP答案 0 :(得分:4)
您可以使用NetAddr::IP和nth
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