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;

관련 정보