【问题标题】:How can I generate a range of IP addresses in Perl?如何在 Perl 中生成 IP 地址范围?
【发布时间】:2011-01-17 19:06:03
【问题描述】:

我需要在 Perl 中生成一个 IP 地址 (IPv4) 列表。我有开始和结束地址,例如 1.1.1.1 和 1.10.20.30。如何打印中间的所有地址?

【问题讨论】:

  • 你为什么需要这样的东西?
  • 我需要自动化一些系统管理任务。是的,使用 perl
  • 好吧,Perl 已经完成了一些奇怪的事情。
  • 我可能错过了一个笑话,但系统管理是 Perl 最常见的应用程序之一。

标签: perl ipv4


【解决方案1】:

使用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。

编辑:如果您专门使用网络块,您可以调查Net::Netmask

【讨论】:

【解决方案2】:

使用Net::IP的循环功能:

+ 运算符被重载,以允许在整个 IP 地址范围内循环:

【讨论】:

    【解决方案3】:

    一切都取决于您的编码方式。这是我所知道的最快的方法。

    my $start = 0x010101; # 1.1.1
    my $end   = 0x0a141e; # 10.20.30
    
    for my $ip ( $start..$end ) { 
        my @ip = ( $ip >> 16 & 0xff
                 , $ip >>  8 & 0xff
                 , $ip       & 0xff
                 );
        print join( '.', 1, @ip ), "\n";
    }
    

    【讨论】:

      【解决方案4】:

      TMTOWTDI:

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

      【讨论】:

      • 对于那些懒得用谷歌搜索的人——“方法不止一种”
      • 这个方法能防止你的数字超过255吗?抱歉,我很难阅读它,我不熟悉 unpack 并且由于某种原因,我网络上的所有搜索引擎似乎都已关闭(无法访问 bing、yahoo 或 google,没有特别的顺序)
      • @onaclov2000: perldoc -f pack, perldoc -f unpack, perldoc perlpacktut 是的,它可以防止它们超过 255。
      【解决方案5】:
      # We can use below code to generate IP range
      
      use warnings;
      use strict;
      my $startIp = $ARGV[0];
      my $endIp = $ARGV[1];
      sub range {
      my (@ip,@newIp,$i,$newIp,$j,$k,$l,$fh);
      my ($j1,$k1,$l1);
      open($fh,">","ip.txt") or die "could not open the file $!";
      @ip = split(/\./,$startIp);
      for($i=$ip[0];$i<=255;$i++) {
        for($j=$ip[1];$j<=255;$j++) {
          $ip[1]=0 if($j == 255);
           for($k=$ip[2];$k<=255;$k++) {
              $ip[2]=0 if($k == 255);
              for($l=$ip[3];$l<=255;$l++) {
                  $ip[3]=0 if($l == 255);
                  @newIp = $newIp = join('.',$i,$j,$k,$l);
                  print $fh "$newIp \n";
                  exit if ($newIp eq $endIp);
              }
            }
          }
        }
      }
      range ($startIp, $endIp);
      

      【讨论】:

        猜你喜欢
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 2011-05-26
        • 2013-11-23
        相关资源
        最近更新 更多