これからの季節に親子でハイキング! >>

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


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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qマスク長をアドレスに変換するコード

例えば、ネットワークアドレスが192.168.0.1/24と与えられた場合に、マスク長の24を読み込んで、255.255.255.0を返すようなコードを作成したいのですが、任意のマスク長を与えて正しいアドレスを返すうまい方法が思いつきません。教えてください。

Aベストアンサー

便利な関数とかモジュールとかありそうな気がするんですが、見つけられなかったのでガリガリ書いてみました。

sub get_subnet_mask {
  my ($network_addr) = @_;
  my $mask_bits = (split '/', $network_addr)[1];
  my $mask = -1 << (32-$mask_bits);
  return join '.', unpack "CCCC", pack "N", $mask;
}

print get_subnet_mask('192.168.0.1/24');

# 255.255.255.0

※インデントに全角空白を使っているので、コピーする場合はタブなどに置き換えてください。

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。

QProxyを利用しているかどうか確認する方法

自分のPCからネットに接続する際
Proxyサーバを経由しているかどうかを
確認する方法はありますか?

Aベストアンサー

ブラウザーがIEの場合として、
ツール→インターネットオプション→接続→LANの設定→LANにプロキシサーバを使用する ここにチェックがはいっていればProxyサーバ経由です。

Qhtml で 変数を定義できますか?

html(できればjava不使用)で変数に文字列をいれてつかう、またはそれに近いことはできないでしょうか?

例**************************
$color1="#000000"

<tr bgcolor=$color1>内容1<tr>
<tr bgcolor=$color1>内容2<tr>
****************************
みたいな感じです

Aベストアンサー

調べりゃ分かることは???だけど。

CSS2で無理やり作れば・・簡単だけど・・・
生成内容、自動番号振り、リスト ( http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/generate.html )
 本来はXSLTで作るほうがよいかと・・・
 <th><xsl:value-of select="parson" />の歌</th>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>サンプル</title>
<meta name="author" content="ORUKA1951">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rev="made" href="mailto:orika1951@hoge.com" title="send a mail" >
<link rel="START" href="../index.html">
<style type="text/css">
<!--
.parson1:before{content:"田中";}
p.age1:after{content:"36歳";}
-->
</style>
</head>
<body>
<h1>サンプル</h1>
<p class="parson1">は男の子</p>
<p class="parson1 age1">の年齢は</p>
<p>私の彼氏は<span class="parson1">君だよ</p>
</body>
</html>

調べりゃ分かることは???だけど。

CSS2で無理やり作れば・・簡単だけど・・・
生成内容、自動番号振り、リスト ( http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/generate.html )
 本来はXSLTで作るほうがよいかと・・・
 <th><xsl:value-of select="parson" />の歌</th>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>サンプル</title>
<met...続きを読む


人気Q&Aランキング