It needs to be grep as a map would return the first line no matter
what - not what I want. Also, this doesn't work:
sub whois
{
my ($whois) = @_;
my $sock = IO::Socket::INET->new(
PeerAddr=>$whois,
PeerPort=>'43',
Timeout=>'60',
);
return undef unless (defined($sock));
$sock->print("n " . $ARGV[0] . "\n");
my @ret = <$sock>;
$sock->close;
my $src = (map {s/.*(ARIN|APNIC).*(?:\n)?/$1/r} @ret)[0];
print "src [$src]\n";
@ret = grep {length($_) and not /#( .*)?/} map { s/\n//; $_ } @ret;
return @ret;
}
Per whois, I've got tons of servers, but arin seems to have info from
most (all?) of them - so if I can get away with that, it should be
quicker (connection wise). However, I figure the easiest way to make
an etl for this is to know what server it's coming from.
On Mon, Mar 3, 2014 at 10:58 PM, Charles DeRykus <[email protected]> wrote:
>
> On Mon, Mar 3, 2014 at 3:35 PM, shawn wilson <[email protected]> wrote:
>>
>> So, when I do this:
>> my $src = (grep {/.*(ARIN|APNIC).*(\n)?/; $1} @ret)[0];
>> I get a full line and not just the capture:
>> # ARIN WHOIS data and services are subject to the Terms of Use
>>
>> When I do this:
>> my $src = (grep {s/.*(ARIN|APNIC).*(\n)?/$1/} @ret)[0];
>> I get just the match but it also alters the array
>>
>
> The trouble is the substitute operator clobbers the $_ which map or grep
> aliases each list item to. The non-destructive /r switch in modern perl
> versions can help (see perlop):
>
> my @hits = map { s/.../$1/r } @ret;
> my $src =$hits[0];
>
> or, maybe:
>
> my $hit = ( map { s/.../$1/r } @ret )[0];
>
> --
> Charles DeRykus
>
>
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/