プロが教えるわが家の防犯対策術!

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


のように記入されています。
宜しくお願い致します。

A 回答 (2件)

「一部の表現に誤りがありましたので訂正させていただきます」


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

サブネットマスクがとびとびでないなら。

以下、表示がくずれるので空白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;
}

この回答への補足

一部の表現に誤りがありましたので訂正させていただきます。
【誤】ひとつのテキストファイルに一行にひとつのセットで記入されています。
【正】ひとつのテキストファイルに一行にひとつづつIPアドレスが書かれています。
すなわちひとつのテキストファイルに1000個以上のIPアドレス帯が書かれています。

申し訳ございませんが、サブネットマスクはとびとびです。宜しくお願い致します。

補足日時:2011/06/24 09:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!