One solution is to grep to find the indices of the elements you wish to multiply, and then feed those indices to map for it to act upon. Here is a function that takes an array ref as the first parameter, and a multiplier as the second parameter. The return value is an array reference to a new array containing the modified values, only for those elements in the original array that "look like numbers."
use strict;
use warnings;
use Scalar::Util qw{ looks_like_number };
use v5.12;
my @array = ( '1', '2', '45', '65', 'what is this' );
my @by2 = @{ multiply( \@array, 2 ) };
say join ', ', @by2;
sub multiply {
my( $aref, $multiplier ) = @_;
return [
map { $aref->[$_] * $multiplier }
grep { looks_like_number( $aref->[$_] ) }
0 .. $#{$aref}
];
}