use v5.36; use JSON::MaybeXS; use Path::Tiny; use Socket "inet_aton"; my @ranges; for (path($ARGV[0])->lines) { my $range= decode_json($_); if ($range->{start_ip} =~ /^\d+\./) { $range->{min}= inet_aton($range->{start_ip}); $range->{max}= inet_aton($range->{end_ip}); push @ranges, $range; } } @ranges= sort { $a->{min} cmp $b->{min} } @ranges; sub find_ip($ip) { my $ip_str= inet_aton($ip); my ($min, $max)= (0, $#ranges); while ($min <= $max) { my $mid= int(($min+$max)/2); if ($ranges[$mid]{min} gt $ip_str) { $max= $mid-1; } elsif ($ranges[$mid]{max} lt $ip_str) { $min= $mid+1; } else { return $ranges[$mid]; } } return undef; } use Data::Printer; say "Enter IPv4"; say "Type ^D to terminate"; while () { chomp; &p( find_ip($_) ); }