Please note that
my $m = ($s =~ m/(\d{1,3})/);
returns the success (true or false) of the match, and
my ($d) = $s =~ m/(\d{1,3})/;
returns the captured substring, if any. (And the enclosing parentheses are irrelevant in the ($s =~ m/(\d{1,3})/) expression in this case.) See perlre, perlretut and perlrequick.
>perl -wMstrict -le
"my $s = 'a987b';
my $m = ($s =~ m/(\d{1,3})/);
print qq{'$m'};
my ($d) = $s =~ m/(\d{1,3})/;
print qq{'$d'};
"
'1'
'987'
Also, it might be better to use the $RE{net}{IPv4} regex from Regexp::Common::net (see Regexp::Common as the general interface module) to match the IP.