Rmck wrote:
> 
> From: "John W. Krahn" <[EMAIL PROTECTED]>
> > 
> > I would do it something like this:
> > 
> > #!/usr/bin/perl
> > use warnings;
> > use strict;
> > use Socket;
> > 
> > my %IPs;
> > while ( <> ) {
> >     $IPs{ inet_aton( $1 ) }++ if /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/;
> >     }
> > 
> > for ( sort keys %IPs ) {
> >     print inet_ntoa( $_ ), "\n";
> >     }
> > 
> > print "\nTotal IP'S = ", scalar keys %IPs, "\n";
> > 
> > __END__
> 
> But, I want to be able to print the numbers that are typos,
> also. like this "111.111.13473"
> That script just drops them.
> Is there a way I could print those at the end of the script
> after the count of real ip's?
> 
> Like:
> Goal Out:
> 111.111.135.11
> 111.222.81.97
> 
> Total IP'S = 2
> 
> Not Ip=111.111.13473

I take it that you only want to accept dotted quad formats because
111.111.13473 IS a valid IP address (as is 127.1 and 1234567890, etc.)

#!/usr/bin/perl
use warnings;
use strict;
use Socket;

my ( %IPs, %invalid );
while ( <> ) {
    for ( /[\d.]+/ ) {
        my $valid;
        if ( defined( $valid = inet_aton $_ ) and $_ eq inet_ntoa $valid ) {
            $IPs{ $valid }++;
            }
        else {
            $invalid{ $_ }++;
            }
        }
    }

for ( sort keys %IPs ) {
    print inet_ntoa( $_ ), "\n";
    }

print "\nTotal IP'S = ", scalar keys %IPs, "\n\n";

print "$_\n" for keys %invalid;

__END__



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to