• 締切済み

PerlでIPアドレスとサブネットマスクから計算

Perlを使用してIPアドレスとサブネットマスクから範囲内にあるIPアドレスを展開できるようにしたいです。 【例】 192.168.1.0 255.255.255.0の場合 ↓↓ 192.168.1.0 192.168.1.1 192.168.1.2    ・    ・    ・ 192.168.1.253 192.168.1.254 192.168.1.255 のような感じに展開できるようなものを作成したいと考えております。(サブネットマスクは様々です。) 何卒宜しくお願い致します。 なお、展開したいIPアドレス帯は1000個以上あります。ひとつのテキストファイルに一行にひとつのセットで記入されています。 【展開したいテキストファイル】 192.168.1.0 255.255.255.0 10.1.1.128 255.255.255.128 ・ ・ ・ 172.16.10.192 255.255.255.192 のように記入されています。 宜しくお願い致します。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「一部の表現に誤りがありましたので訂正させていただきます」 って書いてるけど, 「ひとつのテキストファイルに一行にひとつづつIPアドレスが書かれています」 というなら最初の質問にあった「展開したいテキストファイル」そのものが間違ってるってことだよね. そして, この 「ひとつのテキストファイルに一行にひとつづつIPアドレスが書かれています」 が正しいなら何もする必要ないんじゃないの?

回答No.1

サブネットマスクがとびとびでないなら。以下、表示がくずれるので空白2文字を全角空白にしていることに注意。 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @ip_list1 = get_ip_list( '192.168.1.0', '255.255.255.0' ); print Dumper(\@ip_list1); my @ip_list2 = get_ip_list( '10.1.1.128', '255.255.255.128' ); print Dumper(\@ip_list2); sub get_ip_list {   my $net_var;   if ( $_[0] =~ m/(\d+)\.(\d+)\.(\d+)\.(\d+)/ ) {     $net_var = ( $1 << 24 ) | ( $2 << 16 ) | ( $3 << 8 ) | $4;   }   else {     die $_[0], " is not network address\n";   }   my $mask_var;   if ( $_[1] =~ m/(\d+)\.(\d+)\.(\d+)\.(\d+)/ ) {     $mask_var = ( $1 << 24 ) | ( $2 << 16 ) | ( $3 << 8 ) | $4;   }   else {     die $_[1], " is not net mask\n";   }   my $host_max = ( ~$mask_var ) & 0xFFFFFFFF;   my @ip_list = ();   for ( my $i = 0; $i <= $host_max; $i++ ) {     my $var = $net_var | $i;     my $ip_addr = sprintf '%d.%d.%d.%d', ( $var >> 24 ) & 0xFF,       ( $var >> 16 ) & 0xFF, ( $var >> 8 ) & 0xFF, $var & 0xFF;     push @ip_list, $ip_addr;   }   return @ip_list; }

yasaiumaiumai
質問者

補足

一部の表現に誤りがありましたので訂正させていただきます。 【誤】ひとつのテキストファイルに一行にひとつのセットで記入されています。 【正】ひとつのテキストファイルに一行にひとつづつIPアドレスが書かれています。 すなわちひとつのテキストファイルに1000個以上のIPアドレス帯が書かれています。 申し訳ございませんが、サブネットマスクはとびとびです。宜しくお願い致します。

関連するQ&A