1

我必须遍历 perl 中的一系列 ip 地址并打印该范围内所有 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::IPorNetmask模块,所以寻找其他方法来迭代。

以下解决方案有效,但有一些我似乎无法弄清楚的问题 -

1 - 我的开始和结束将是 perl 变量“”,而不是下面代码中提到的。下面的代码不适用于 start="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;
}
4

2 回答 2

1

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

use Net::IP;
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。

于 2017-04-29T09:58:40.893 回答
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;
于 2013-06-19T00:24:27.733 回答