intは使用されているPerlライブラリのintではないようです。

intは使用されているPerlライブラリのintではないようです。

私の心の中で奇妙な現象が起こった。ご存知のように、インターネットに直接公開されているメールサーバーを扱うことは、多くの人が侵入したり中継手段として使用しようとしているため、かなり「楽しい」ことになります。少しの努力が必要ですが、ファイアウォールを介してアドレスや範囲を手動でブロックすることに問題はありませんでした。私はプロセス全体を自動化するためにFail2banを使用することにあまり熱心ではありません。むしろ「何が起こったのか」知りたいです。

そのため、iptablesとip6tablesを使用してさまざまなルールを作成し、その数がほとんど停滞しました。それでも、ある程度組織的な外観を維持するために、ブロックされたV4 IPおよびV4範囲の数をV4アドレスの合計数に関連付けたいと思います。後者については、ルーティングされていないブロードキャストアドレスやプライベートアドレス範囲など、一部の許可されていないアドレスがあることを無視しました。代わりに、私は単に4バイトの2^32アドレスがあるかもしれないと仮定しました。

iptablesのルールでは、フィルタ(主にawk)を使用して指定されたIP範囲を抽出し、次のリストを取得します。

...
27.72.155.100/32
37.9.0.0/20
37.9.32.0/20
37.9.48.0/21
37.9.64.0/18
37.9.128.0/21
...

したがって、アドレスとマスクの重要なビットの一般的な組み合わせです。私はこのリストを処理するためにSTDINを処理する小さなPerlプログラムを使います。これらの文字列で影響を受けるアドレスの数を確認するために便利な処理を提供するPerlライブラリ「Net :: IP」を使用しました。たとえば、後で$str = "37.9.32.0/20"実行でき$ip = new Net::IP($str); $count = $ip -> size();、$countには2^(32-20)の結果である4096が含まれます。今まではそんなに良くなった。

$countを使用して計算を実行しようとすると問題が発生します。すべての数量を合計した後、2 ^ 32で割って可能な総IPの割合を決定したいと思います。単一値の場合でも問題は明らかです。決定された数量4096を3で除算しようとすると、浮動小数点数「1365.33 ...」は生成されず、整数値1365のみが生成されます。明確な形式を得るために分割前に変換しようとしましたが、役に立ちませんでした。 Net::IP が使用するオブジェクト指向コードに関連している可能性があります。私は元のアセンブリプログラマーとして、オブジェクト指向プログラミングに精通していないことが困難であることを認めています。次の理由で必要になる場合があります\$count -> getInt()

私は無差別アプローチをとり、実際にループ内のIP数を繰り返してNet :: IPのOOP結果を減らすことで、所望の浮動小数点結果を得ました。しかし、これは実際にはとても粗雑で、Net :: IPのエレガントな概念を完全に迂回します。また、その有名な「アハ効果」を作り出す方法を教えてくれる専門家が皆さんの中にいると確信し、期待しています。 Perlで単一のIPアドレス/マスクに縮小された私が使用したソースコードは次のとおりです。

#!/usr/bin/perl
use strict;
use Net::IP;
my $count = 0;
my $str = "37.9.32.0/20";
my $ip = new Net::IP($str) or die (Net::IP::Error());
my $count = $ip -> size();

print "this is the result of 4096/3\t\t\t: ", 4096 / 3, "\n";
print "this is count\t\t\t\t\t: ", $count, "\n";
print "and this is the result of \$count / 3\t\t: ", $count / 3, "\n";
print "and this is the result of int(\$count) / 3\t: ", int($count) / 3, "\n";

my $countW = 0;
while ($count > 0) {
        $count--;
        $countW++;
}
print "and now comes the result of \$countW / 3\t\t: ", $countW / 3, "\n";

ここで生成される出力は次のとおりです。

this is the result of 4096/3                    : 1365.33333333333
this is count                                   : 4096
and this is the result of $count / 3            : 1365
and this is the result of int($count) / 3       : 1365
and now comes the result of $countW / 3         : 1365.33333333333

ベストアンサー1

オブジェクト指向コードに対するあなたの推測は正確です。blessedで確認しやすいです。スカラー::ユティル:

use Scalar::Util qw{ blessed };
...
warn blessed($count);  # Math::BigInt at script.pl line XX.

これは、おそらくモジュールの作成者が、数値が通常の整数よりはるかに大きくなる可能性があると懸念していたからです。

バラより数学::BigIntこれはクラスのドキュメントです。たとえば、このnumify方法を使用して純粋な数字を取得できます。

my $count = $ip->size->numify;

おすすめ記事