2013-06-18 164 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。