2013-06-18 135 views
1

我必须在perl中遍历一系列ip地址,并打印出该范围内所有ip的列表。对于前 - 为在perl中迭代IP地址范围

192.168.122.1-192.168.122.4 

我的返回值是

192.168.122.1, 192.168.122.2, 192.168.122.3, 192.168.122.4 

我也不能使用Net::IPNetmask模块,所以寻找其他方式来进行迭代。

随着解决方案的工作,但有一些问题,我似乎无法弄清楚 -

1 - 我的起点和终点将是perl的变量“”,而不是如下面的代码中提到。下面的代码不适用于开始=“192.168.122.1”

2 - 我怎样才能得到所有ips尾部列表?

sub inc_ip { $_[0] = pack "N", 1 + unpack "N", $_[0] } 
my $start = 192.168.122.1; 
my $end = 192.168.122.4; 
for ($ip = $start; $ip le $end; inc_ip($ip)) { 
    printf "%vd\n", $ip; 
} 
+1

是什么让你说你不能使用'Net :: IP'或'Net :: Netmask'? – innaM

回答

0

你似乎想:​​

use Socket 'inet_aton'; 
my $start = "192.168.122.1"; 
my $end = "192.168.122.4"; 
my @x = map { sprintf "%vi", pack "N", $_ } unpack("N",inet_aton($start)) .. unpack("N",inet_aton($end)); 
use DDP; p @x; 
+0

是inet_aton和inet_ntoa。刚刚得到答案。谢谢 – user1060517

0

使用Net::IP。从CPAN文档:

my $ip = new Net::IP ('195.45.6.7 - 195.45.6.19') || die; 
# Loop 
do { 
    print $ip->ip(), "\n"; 
} while (++$ip); 

该方法更灵活,因为Net :: IP接受CIDR表示法,例如, 193.0.1/24并且还支持IPv6。